鱼C论坛

 找回密码
 立即注册
查看: 30|回复: 7

Python 如何筛选后透视

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import pandas as pd
data=pd.read_excel('时间序列.xlsx')
data.head()
        日期        业态        产品        推广平台        城市        展现量        点击量        消费        返点        推广方式
0        2020-04-25        互联网        网站建设        神马搜索        杭州        10.0        1.0        9.45        0.35        网运
1        2020-04-25        互联网        网站建设        神马搜索        长沙        7.0        0.0        0.00        0.35        网运
2        2020-04-25        互联网        微信业务        搜狗搜索        杭州        6.0        1.0        1.26        0.35        网运
3        2020-04-25        互联网        微信业务        神马搜索        杭州        15.0        1.0        7.27        0.35        网运
4        2020-04-25        互联网        微信业务        神马搜索        长沙        5.0        1.0        14.9  0.35        网运


先先帅城市属于长沙的,然后透视消费和返点合计
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 4 小时前 | 显示全部楼层
Python 如何筛选后透视:先筛选城市属于长沙的,然后透视消费和返点合计


首先,使用 pandas 筛选出城市为“长沙”的数据,然后通过 pivot_table 函数对消费和返点进行合计(求和)。以下是一个示例代码,假设按“日期”分组透视:


  1. import pandas as pd

  2. # 读取 Excel 文件
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 筛选城市为长沙的数据
  5. filtered_data = data[data['城市'] == '长沙']

  6. # 透视:按日期分组,对消费和返点求和
  7. pivot_result = pd.pivot_table(filtered_data,
  8.                                values=['消费', '返点'],
  9.                                index='日期',
  10.                                aggfunc='sum')

  11. # 打印结果
  12. print(pivot_result)
复制代码


如果希望按其他列分组(例如“产品”或“推广平台”),可以修改 index 参数。例如,按“产品”分组:


  1. pivot_result = pd.pivot_table(filtered_data,
  2.                                values=['消费', '返点'],
  3.                                index='产品',
  4.                                aggfunc='sum')
复制代码


或者按多列分组(例如“日期”和“产品”):


  1. pivot_result = pd.pivot_table(filtered_data,
  2.                                values=['消费', '返点'],
  3.                                index=['日期', '产品'],
  4.                                aggfunc='sum')
复制代码


这样就能得到筛选后消费和返点的合计透视表。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
如果很多城市,就不帅选长沙,代码怎么写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
冰菲 发表于 2026-01-27 10:16
如果很多城市,就不帅选长沙,代码怎么写


你可以写一个通用的函数,根据条件决定是否筛选。以下是一种实现方式:


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 获取城市列表
  5. city_list = data['城市'].unique()

  6. # 如果城市数量少,筛选长沙;如果城市多,不筛选
  7. if len(city_list) <= 5:  # 这里假设5个城市为阈值,可调整
  8.     filtered_data = data[data['城市'] == '长沙']
  9.     print(f"城市较少({len(city_list)}个),已筛选长沙数据")
  10. else:
  11.     filtered_data = data
  12.     print(f"城市较多({len(city_list)}个),使用全部数据")

  13. # 透视:按日期分组,对消费和返点求和
  14. pivot_result = pd.pivot_table(filtered_data,
  15.                                values=['消费', '返点'],
  16.                                index='日期',
  17.                                aggfunc='sum')

  18. print(pivot_result)
复制代码


或者,如果你想要手动控制是否筛选,可以使用一个标志变量:


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 设置是否筛选的标志
  5. should_filter = False  # 设为True则筛选长沙,False则不筛选

  6. if should_filter:
  7.     filtered_data = data[data['城市'] == '长沙']
  8.     print("已筛选长沙数据")
  9. else:
  10.     filtered_data = data
  11.     print("使用全部数据")

  12. # 透视:按日期分组,对消费和返点求和
  13. pivot_result = pd.pivot_table(filtered_data,
  14.                                values=['消费', '返点'],
  15.                                index='日期',
  16.                                aggfunc='sum')

  17. print(pivot_result)
复制代码


还有一种更灵活的方式是使用函数参数控制:


  1. import pandas as pd

  2. def pivot_data(filter_city=None):
  3.     # 读取数据
  4.     data = pd.read_excel('时间序列.xlsx')
  5.    
  6.     # 根据参数决定是否筛选
  7.     if filter_city:
  8.         data = data[data['城市'] == filter_city]
  9.         print(f"已筛选{filter_city}的数据")
  10.    
  11.     # 透视
  12.     pivot_result = pd.pivot_table(data,
  13.                                    values=['消费', '返点'],
  14.                                    index='日期',
  15.                                    aggfunc='sum')
  16.     return pivot_result

  17. # 使用示例
  18. # 不筛选任何城市
  19. result_all = pivot_data()
  20. print(result_all)

  21. # 筛选长沙
  22. result_changsha = pivot_data(filter_city='长沙')
  23. print(result_changsha)
复制代码


这些方法都可以让你灵活地控制是否筛选特定城市,根据实际需求选择最适合的方案。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 3 小时前 | 显示全部楼层
字段没有规律,只想不筛选长沙,其他很多是城市和省份,不规律
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 3 小时前 | 显示全部楼层
冰菲 发表于 2026-01-27 10:19
字段没有规律,只想不筛选长沙,其他很多是城市和省份 ...


针对这种情况,我们可以调整代码逻辑,根据具体需求来处理筛选问题。以下是几种常见场景的解决方案:

方案1:如果需要筛选长沙以外的数据


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 筛选出不是长沙的数据
  5. filtered_data = data[data['城市'] != '长沙']

  6. # 透视:按日期分组,对消费和返点求和
  7. pivot_result = pd.pivot_table(filtered_data,
  8.                                values=['消费', '返点'],
  9.                                index='日期',
  10.                                aggfunc='sum')

  11. # 打印结果
  12. print(pivot_result)
复制代码


方案2:如果想对所有城市数据进行透视


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 直接透视,不进行城市筛选
  5. pivot_result = pd.pivot_table(data,
  6.                                values=['消费', '返点'],
  7.                                index='日期',
  8.                                aggfunc='sum')

  9. # 打印结果
  10. print(pivot_result)
复制代码


方案3:如果想按城市分组查看消费和返点合计


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 按城市分组透视
  5. pivot_result = pd.pivot_table(data,
  6.                                values=['消费', '返点'],
  7.                                index='城市',
  8.                                aggfunc='sum')

  9. # 打印结果
  10. print(pivot_result)
复制代码


方案4:如果想同时按多个维度透视


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 按日期和城市两个维度透视
  5. pivot_result = pd.pivot_table(data,
  6.                                values=['消费', '返点'],
  7.                                index=['日期', '城市'],
  8.                                aggfunc='sum')

  9. # 打印结果
  10. print(pivot_result)
复制代码


方案5:如果只想看某个特定城市的透视结果


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 获取所有城市列表
  5. city_list = data['城市'].unique()

  6. # 查看有哪些城市
  7. print("可用城市:", city_list)

  8. # 让用户选择要透视的城市
  9. selected_city = input("请输入要透视的城市名称: ")

  10. # 筛选选定城市的数据
  11. filtered_data = data[data['城市'] == selected_city]

  12. # 透视
  13. pivot_result = pd.pivot_table(filtered_data,
  14.                                values=['消费', '返点'],
  15.                                index='日期',
  16.                                aggfunc='sum')

  17. print(f"{selected_city}的消费和返点合计:")
  18. print(pivot_result)
复制代码


你可以根据实际需求选择适合的方案。如果你有特定需求,可以进一步描述问题,我会提供更精准的解决方案。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
Length mismatch: Expected axis has 1 elements, new values have 4 elements
报错了,什么意思

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
冰菲 发表于 2026-01-27 12:01
Length mismatch: Expected axis has 1 elements, new ...


这个错误通常发生在给 DataFrame 的列或索引赋值时,新值的数量与原有数量不匹配。让我分析几个可能的原因和解决方案:

常见原因:

  • 尝试给 DataFrame 赋值时,值的数量与索引或列数不匹配
  • 重命名列或索引时,提供的名称数量与原有数量不一致
  • 使用 assign() 方法时,列数不匹配


解决方案:

1. 检查列名赋值:


  1. # 错误示例:原DataFrame有1列,尝试赋4列值
  2. df.columns = ['新列1', '新列2', '新列3', '新列4']  # 如果df只有1列,就会报错

  3. # 正确做法:先检查列数
  4. print("原DataFrame列数:", len(df.columns))
  5. print("原列名:", df.columns.tolist())
复制代码


2. 检查筛选后的数据透视:


  1. import pandas as pd

  2. # 读取数据
  3. data = pd.read_excel('时间序列.xlsx')

  4. # 先检查筛选后的数据
  5. filtered_data = data[data['城市'] != '长沙']

  6. # 检查筛选结果是否为空
  7. print("筛选后数据行数:", len(filtered_data))
  8. print("筛选后数据列数:", len(filtered_data.columns))

  9. # 确保values中的列名存在
  10. required_columns = ['消费', '返点']
  11. for col in required_columns:
  12.     if col not in filtered_data.columns:
  13.         print(f"警告: 列 '{col}' 不存在!")

  14. # 然后进行透视
  15. if len(filtered_data) > 0:
  16.     try:
  17.         pivot_result = filtered_data.pivot_table(
  18.             values=required_columns,
  19.             index='日期',
  20.             aggfunc='sum'
  21.         )
  22.         print(pivot_result)
  23.     except Exception as e:
  24.         print("透视出错:", e)
  25. else:
  26.     print("筛选后数据为空!")
复制代码


3. 检查多级索引问题:


  1. # 如果使用多级索引,确保层次正确
  2. print("索引层次:", filtered_data.index.nlevels)
  3. print("列层次:", filtered_data.columns.nlevels)

  4. # 重置索引可能有助于解决问题
  5. filtered_data_reset = filtered_data.reset_index()

  6. # 然后再尝试透视
  7. pivot_result = filtered_data_reset.pivot_table(
  8.     values=['消费', '返点'],
  9.     index='日期',
  10.     aggfunc='sum'
  11. )
复制代码


4. 检查数据列类型:


  1. # 查看数据类型
  2. print("数据类型:")
  3. print(filtered_data.dtypes)

  4. # 确保透视所需的列是数值型
  5. if filtered_data['消费'].dtype not in ['int64', 'float64']:
  6.     print("消费列不是数值类型,尝试转换...")
  7.     filtered_data['消费'] = pd.to_numeric(filtered_data['消费'], errors='coerce')
  8.    
  9. if filtered_data['返点'].dtype not in ['int64', 'float64']:
  10.     print("返点列不是数值类型,尝试转换...")
  11.     filtered_data['返点'] = pd.to_numeric(filtered_data['返点'], errors='coerce')
复制代码


5. 使用更安全的透视方式:


  1. # 方法1:使用groupby替代pivot_table
  2. pivot_result = filtered_data.groupby('日期')[['消费', '返点']].sum()
  3. print("使用groupby的结果:")
  4. print(pivot_result)

  5. # 方法2:使用crosstab
  6. pivot_result = pd.crosstab(
  7.     index=filtered_data['日期'],
  8.     columns=['消费合计', '返点合计'],
  9.     values=[filtered_data['消费'], filtered_data['返点']],
  10.     aggfunc='sum'
  11. )
复制代码


6. 调试步骤:


  1. # 逐步调试,找出问题所在
  2. print("=== 调试信息 ===")
  3. print("1. 原始数据形状:", data.shape)
  4. print("2. 原始数据列名:", data.columns.tolist())
  5. print("3. 筛选条件生效的行数:", sum(data['城市'] != '长沙'))
  6. print("4. 筛选后数据形状:", filtered_data.shape)
  7. print("5. 筛选后数据前5行:")
  8. print(filtered_data.head())
  9. print("6. 日期列的唯一值数量:", filtered_data['日期'].nunique())
  10. print("7. 消费列是否有缺失值:", filtered_data['消费'].isnull().sum())
  11. print("8. 返点列是否有缺失值:", filtered_data['返点'].isnull().sum())
复制代码


建议:

先运行调试步骤,查看输出结果,这能帮助你定位具体是哪个环节出了问题。最常见的错误原因是:
1. 筛选后数据为空
2. 列名不存在或拼写错误
3. 数据类型不匹配

请分享调试步骤的输出结果,我可以帮你进一步分析具体问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-27 14:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表