Python 如何筛选后透视
import pandas as pddata=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.90.35 网运
先先帅城市属于长沙的,然后透视消费和返点合计 Python 如何筛选后透视:先筛选城市属于长沙的,然后透视消费和返点合计
首先,使用 pandas 筛选出城市为“长沙”的数据,然后通过 pivot_table 函数对消费和返点进行合计(求和)。以下是一个示例代码,假设按“日期”分组透视:
import pandas as pd
# 读取 Excel 文件
data = pd.read_excel('时间序列.xlsx')
# 筛选城市为长沙的数据
filtered_data = data == '长沙']
# 透视:按日期分组,对消费和返点求和
pivot_result = pd.pivot_table(filtered_data,
values=['消费', '返点'],
index='日期',
aggfunc='sum')
# 打印结果
print(pivot_result)
如果希望按其他列分组(例如“产品”或“推广平台”),可以修改 index 参数。例如,按“产品”分组:
pivot_result = pd.pivot_table(filtered_data,
values=['消费', '返点'],
index='产品',
aggfunc='sum')
或者按多列分组(例如“日期”和“产品”):
pivot_result = pd.pivot_table(filtered_data,
values=['消费', '返点'],
index=['日期', '产品'],
aggfunc='sum')
这样就能得到筛选后消费和返点的合计透视表。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 如果很多城市,就不帅选长沙,代码怎么写 冰菲 发表于 2026-01-27 10:16
如果很多城市,就不帅选长沙,代码怎么写
你可以写一个通用的函数,根据条件决定是否筛选。以下是一种实现方式:
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 获取城市列表
city_list = data['城市'].unique()
# 如果城市数量少,筛选长沙;如果城市多,不筛选
if len(city_list) <= 5:# 这里假设5个城市为阈值,可调整
filtered_data = data == '长沙']
print(f"城市较少({len(city_list)}个),已筛选长沙数据")
else:
filtered_data = data
print(f"城市较多({len(city_list)}个),使用全部数据")
# 透视:按日期分组,对消费和返点求和
pivot_result = pd.pivot_table(filtered_data,
values=['消费', '返点'],
index='日期',
aggfunc='sum')
print(pivot_result)
或者,如果你想要手动控制是否筛选,可以使用一个标志变量:
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 设置是否筛选的标志
should_filter = False# 设为True则筛选长沙,False则不筛选
if should_filter:
filtered_data = data == '长沙']
print("已筛选长沙数据")
else:
filtered_data = data
print("使用全部数据")
# 透视:按日期分组,对消费和返点求和
pivot_result = pd.pivot_table(filtered_data,
values=['消费', '返点'],
index='日期',
aggfunc='sum')
print(pivot_result)
还有一种更灵活的方式是使用函数参数控制:
import pandas as pd
def pivot_data(filter_city=None):
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 根据参数决定是否筛选
if filter_city:
data = data == filter_city]
print(f"已筛选{filter_city}的数据")
# 透视
pivot_result = pd.pivot_table(data,
values=['消费', '返点'],
index='日期',
aggfunc='sum')
return pivot_result
# 使用示例
# 不筛选任何城市
result_all = pivot_data()
print(result_all)
# 筛选长沙
result_changsha = pivot_data(filter_city='长沙')
print(result_changsha)
这些方法都可以让你灵活地控制是否筛选特定城市,根据实际需求选择最适合的方案。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 字段没有规律,只想不筛选长沙,其他很多是城市和省份,不规律 冰菲 发表于 2026-01-27 10:19
字段没有规律,只想不筛选长沙,其他很多是城市和省份 ...
针对这种情况,我们可以调整代码逻辑,根据具体需求来处理筛选问题。以下是几种常见场景的解决方案:
方案1:如果需要筛选长沙以外的数据
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 筛选出不是长沙的数据
filtered_data = data != '长沙']
# 透视:按日期分组,对消费和返点求和
pivot_result = pd.pivot_table(filtered_data,
values=['消费', '返点'],
index='日期',
aggfunc='sum')
# 打印结果
print(pivot_result)
方案2:如果想对所有城市数据进行透视
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 直接透视,不进行城市筛选
pivot_result = pd.pivot_table(data,
values=['消费', '返点'],
index='日期',
aggfunc='sum')
# 打印结果
print(pivot_result)
方案3:如果想按城市分组查看消费和返点合计
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 按城市分组透视
pivot_result = pd.pivot_table(data,
values=['消费', '返点'],
index='城市',
aggfunc='sum')
# 打印结果
print(pivot_result)
方案4:如果想同时按多个维度透视
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 按日期和城市两个维度透视
pivot_result = pd.pivot_table(data,
values=['消费', '返点'],
index=['日期', '城市'],
aggfunc='sum')
# 打印结果
print(pivot_result)
方案5:如果只想看某个特定城市的透视结果
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 获取所有城市列表
city_list = data['城市'].unique()
# 查看有哪些城市
print("可用城市:", city_list)
# 让用户选择要透视的城市
selected_city = input("请输入要透视的城市名称: ")
# 筛选选定城市的数据
filtered_data = data == selected_city]
# 透视
pivot_result = pd.pivot_table(filtered_data,
values=['消费', '返点'],
index='日期',
aggfunc='sum')
print(f"{selected_city}的消费和返点合计:")
print(pivot_result)
你可以根据实际需求选择适合的方案。如果你有特定需求,可以进一步描述问题,我会提供更精准的解决方案。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 Length mismatch: Expected axis has 1 elements, new values have 4 elements
报错了,什么意思
冰菲 发表于 2026-01-27 12:01
Length mismatch: Expected axis has 1 elements, new ...
这个错误通常发生在给 DataFrame 的列或索引赋值时,新值的数量与原有数量不匹配。让我分析几个可能的原因和解决方案:
常见原因:
[*]尝试给 DataFrame 赋值时,值的数量与索引或列数不匹配
[*]重命名列或索引时,提供的名称数量与原有数量不一致
[*]使用 assign() 方法时,列数不匹配
解决方案:
1. 检查列名赋值:
# 错误示例:原DataFrame有1列,尝试赋4列值
df.columns = ['新列1', '新列2', '新列3', '新列4']# 如果df只有1列,就会报错
# 正确做法:先检查列数
print("原DataFrame列数:", len(df.columns))
print("原列名:", df.columns.tolist())
2. 检查筛选后的数据透视:
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 先检查筛选后的数据
filtered_data = data != '长沙']
# 检查筛选结果是否为空
print("筛选后数据行数:", len(filtered_data))
print("筛选后数据列数:", len(filtered_data.columns))
# 确保values中的列名存在
required_columns = ['消费', '返点']
for col in required_columns:
if col not in filtered_data.columns:
print(f"警告: 列 '{col}' 不存在!")
# 然后进行透视
if len(filtered_data) > 0:
try:
pivot_result = filtered_data.pivot_table(
values=required_columns,
index='日期',
aggfunc='sum'
)
print(pivot_result)
except Exception as e:
print("透视出错:", e)
else:
print("筛选后数据为空!")
3. 检查多级索引问题:
# 如果使用多级索引,确保层次正确
print("索引层次:", filtered_data.index.nlevels)
print("列层次:", filtered_data.columns.nlevels)
# 重置索引可能有助于解决问题
filtered_data_reset = filtered_data.reset_index()
# 然后再尝试透视
pivot_result = filtered_data_reset.pivot_table(
values=['消费', '返点'],
index='日期',
aggfunc='sum'
)
4. 检查数据列类型:
# 查看数据类型
print("数据类型:")
print(filtered_data.dtypes)
# 确保透视所需的列是数值型
if filtered_data['消费'].dtype not in ['int64', 'float64']:
print("消费列不是数值类型,尝试转换...")
filtered_data['消费'] = pd.to_numeric(filtered_data['消费'], errors='coerce')
if filtered_data['返点'].dtype not in ['int64', 'float64']:
print("返点列不是数值类型,尝试转换...")
filtered_data['返点'] = pd.to_numeric(filtered_data['返点'], errors='coerce')
5. 使用更安全的透视方式:
# 方法1:使用groupby替代pivot_table
pivot_result = filtered_data.groupby('日期')[['消费', '返点']].sum()
print("使用groupby的结果:")
print(pivot_result)
# 方法2:使用crosstab
pivot_result = pd.crosstab(
index=filtered_data['日期'],
columns=['消费合计', '返点合计'],
values=, filtered_data['返点']],
aggfunc='sum'
)
6. 调试步骤:
# 逐步调试,找出问题所在
print("=== 调试信息 ===")
print("1. 原始数据形状:", data.shape)
print("2. 原始数据列名:", data.columns.tolist())
print("3. 筛选条件生效的行数:", sum(data['城市'] != '长沙'))
print("4. 筛选后数据形状:", filtered_data.shape)
print("5. 筛选后数据前5行:")
print(filtered_data.head())
print("6. 日期列的唯一值数量:", filtered_data['日期'].nunique())
print("7. 消费列是否有缺失值:", filtered_data['消费'].isnull().sum())
print("8. 返点列是否有缺失值:", filtered_data['返点'].isnull().sum())
建议:
先运行调试步骤,查看输出结果,这能帮助你定位具体是哪个环节出了问题。最常见的错误原因是:
1. 筛选后数据为空
2. 列名不存在或拼写错误
3. 数据类型不匹配
请分享调试步骤的输出结果,我可以帮你进一步分析具体问题。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 按日期和城市两个维度透视
pivot_result = pd.pivot_table(data,
values=['消费', '返点'],
index=['日期', '城市'],
aggfunc='sum')
# 打印结果
print(pivot_result)
这个代码中城市如果有空格的,对应的日期也不显示,如何让空白的也显示出来 冰菲 发表于 2026-01-28 12:41
import pandas as pd
# 读取数据
data = pd.read_ ...
我们可以通过设置 `pivot_table` 的 `dropna` 参数来控制是否忽略缺失值。默认情况下,`dropna=True` 会忽略包含缺失值的行。要显示空白(NaN)的数据,可以设置 `dropna=False`。
修改后的代码如下:
import pandas as pd
# 读取数据
data = pd.read_excel('时间序列.xlsx')
# 按日期和城市两个维度透视,设置dropna=False以显示空白
pivot_result = pd.pivot_table(data,
values=,
index=,
aggfunc='sum',
dropna=False)
# 打印结果
print(pivot_result)
注意:
1. `dropna=False` 会让透视表包含缺失值(NaN)的行。
2. 如果数据量很大,且包含很多缺失值,设置 `dropna=False` 可能会增加计算量。
3. 缺失值在结果中会显示为 `NaN`。
另外,如果你希望将缺失值显示为其他值(比如0),可以在透视后使用 `fillna()` 方法:
pivot_result_filled = pivot_result.fillna(0)
print(pivot_result_filled)
这样,原本空白的地方就会显示为0了。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]