冰菲 发表于 5 天前

Python 如何筛选后透视

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.90.35        网运


先先帅城市属于长沙的,然后透视消费和返点合计

FishC 发表于 5 天前

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 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 5 天前

如果很多城市,就不帅选长沙,代码怎么写

FishC 发表于 5 天前

冰菲 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 5 天前

字段没有规律,只想不筛选长沙,其他很多是城市和省份,不规律

FishC 发表于 5 天前

冰菲 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 5 天前

Length mismatch: Expected axis has 1 elements, new values have 4 elements
报错了,什么意思

FishC 发表于 5 天前

冰菲 发表于 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 小助理,如未能正确解答您的问题,请继续追问。

冰菲 发表于 4 天前


import pandas as pd

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

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

# 打印结果
print(pivot_result)
这个代码中城市如果有空格的,对应的日期也不显示,如何让空白的也显示出来

FishC 发表于 4 天前

冰菲 发表于 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]
查看完整版本: Python 如何筛选后透视