【问题标题】:Groupby using conditions from another column使用另一列中的条件进行分组
【发布时间】:2020-05-22 15:11:00
【问题描述】:

这是一个非常基本的问题,但我的大脑正在放弃我,我非常感谢一些帮助。

我有一个包含 10000 行的数据集。 我有一个包含 100 个唯一区域名称的区域名称列。 我有一个类型列,类型范围从 1 到 10。 我有一个支出专栏。

我想按地区名称对其进行分组,并添加一个新列,其中包含每个名称的平均支出(甚至在旧支出列中)。

但是: 我只想要 1-7 类型的平均值。因此,我想排除该区域中的任何类型 8、9 或 10。 除非,如果一个区域只包含类型 8、9 或 10。在这种情况下,我想要该支出的平均值。

我玩过的东西,但还没有真正做到:

方法一: 创建 2 个数据集,一个具有类型 1-7,另一个在一个区域中只有类型 8、9 或 10:

main=['1.','2.', '3.','4.', '5.', '6.', '7.']
eight_to_ten=['8.', '9.', '10.']

df_main = df[df['Type'].isin(main)]
df_main['avg_sales'] = df_main.groupby(['Area Name'])['Sales'].mean()

方法二:

df_new['avg_sales'] = df[df['Type'].isin(main)].groupby('Area Name')['Sales'].mean()

我认为有一种非常短的方法可以做到这一点,很可能不必将数据集分成 2 份然后将其连接回来。

使用 for 循环更容易做到吗?

任何帮助将不胜感激

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    我相信您需要按列表过滤第一行,如果需要每个组的新列,请使用GroupBy.transform

    m1 = df['Type'].isin(main)
    m2 = df['Type'].isin(eight_to_ten)
    df = df_main[m1 | m2].copy()
    df['avg_sales'] = df.groupby(['Area Name', m1])['Sales'].transform('mean')
    

    或者为带有聚合的新 DataFrame 添加新数组以区分组:

    arr = np.where(m1, 'first','second')
    df1 = df.groupby(['Area Name', arr])['Sales'].mean().reset_index()
    

    【讨论】:

    • 谢谢!这很接近但并不完全——这个数据集返回 9500 行——看起来只有类型为 8-10 的那些,这是大多数。我需要最终的数据集有 100 行 - 所以所有唯一的区域名称,每个区域的平均支出取决于商店的类型。
    • @lala345 - 你需要this 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 2023-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    相关资源
    最近更新 更多