【问题标题】:Python Pandas Groupby isinPython Pandas Groupby isin
【发布时间】:2018-05-30 19:12:49
【问题描述】:

我有一个数据框,其中列出了不同的团队(绿色、蓝色、黄色、橙色、[有数百个团队]等),还列出了他们每月的收入。我希望能够根据收入创建前 10 名团队的列表,然后将其输入到 groupby 语句中,这样我在处理各种数据框时只查看这些团队。这些是我创建的语句,但我遇到了问题:

Rev = df['Revenue'].head(10) and I have also used Rev = df.nlargest(10,['Revenue'])

grpby = df.groupby([df['team'].isin(rev), 'team'], as_index=False)['Revenue'].sum().sort_values('Revenue', ascending=False).reset_index()

*编辑:导致此请求的其他代码: *编辑:df = pd.read_excel('c:/Test.xlsx', sheet_name="Sheet1", index_col = 'Date', parse_dates=True)

*编辑:df = pd.DataFrame(df)

我可以使 groupby 语句工作,但我无法将“Rev”列表提供给限制/过滤要查看的组的 groupby 语句。

另外,当使用 groupby 语句创建数据框时,如何添加回未分组的其他列?例如,在我上面的陈述中,我尝试使用“团队”和“收入”,但如果我还想在其他列中添加(“位置”或“团队领导”),在更多列中添加的语法是什么?

*编辑 通过 excel 文件输入示例: 团队收入 绿色 10 蓝色 15 红20 橙色 5 在上面的例子中,我想使用一个语句,它取前三个并保存为一个列表,然后将其输入到 groupby 语句中。现在看起来我还没有填充实际的数据框? *从控制台: 空数据框 列:[团队,收入] 索引:[]

【问题讨论】:

  • 请展示一些示例数据和预期输出

标签: python pandas pandas-groupby


【解决方案1】:

boolean indexing 需要过滤器作为第一步:

示例

df = pd.DataFrame({'Teams': ['Green', 'Blue', 'Red', 'Orange', 'Green', 'Blue', 'Grey', 'Purple'], 
                   'Revenue': [18, 15, 20, 5, 10, 15, 2, 5], 
                   'Location': ['A', 'B', 'V', 'G', 'A', 'D', 'B', 'C']})

print (df)
    Teams  Revenue Location
0   Green       18        A
1    Blue       15        B
2     Red       20        V
3  Orange        5        G
4   Green       10        A
5    Blue       15        D
6    Grey        2        B
7  Purple        5        C

首先获取最高值并选择列Teams

Rev = df.nlargest(3,'Revenue')['Teams']
print (Rev)
2      Red
0    Green
1     Blue
Name: Teams, dtype: object

然后需要先过滤boolean indexing:

print (df[df['Teams'].isin(Rev)])
   Teams  Revenue Location
0  Green       18        A
1   Blue       15        B
2    Red       20        V
4  Green       10        A
5   Blue       15        D

df1 = (df[df['Teams'].isin(Rev)]
        .groupby('Teams',as_index=False)['Revenue']
        .sum()
        .sort_values('Revenue', ascending=False))
print (df1)
   Teams  Revenue
0   Blue       30
1  Green       28
2    Red       20

如果需要输出多个列,则需要为每个列设置聚合函数,例如:

df2 = (df[df['Teams'].isin(Rev)]
        .groupby('Teams',as_index=False)
        .agg({'Revenue':'sum', 'Location': ', '.join, 'Another col':'mean'}))
print (df2)
   Teams  Revenue Location
0   Blue       30     B, D
1  Green       28     A, A
2    Red       20        V

【讨论】:

  • 谢谢 Jezrael,我能够实现这一点,但控制台显示“空 DataFrame”你知道为什么会这样吗?
  • 谢谢 Jezrael,这非常有帮助!
猜你喜欢
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-14
  • 2013-09-23
  • 2014-11-23
  • 2020-10-05
相关资源
最近更新 更多