如何在分组时创建自定义列,然后在熊猫中聚合

时间:2018-07-15 09:26:28

标签: python pandas dataframe

我有以下格式的DataFrame

| User          | CodeID        | Language |
| ------------- |---------------| -------- |
| foo           | 1             | C        |
| foo           | 2             | C        |
| foo           | 3             | CPP      |
| bar           | 4             | C        |
| bar           | 5             | CPP      |
| bar           | 6             | Java     |
| bar           | 7             | CPP      |

现在,我要为每个用户计算每种语言的代码数量。那就是我想要的DataFrame采用以下格式。

| User | C  | CPP | Java | Total |
| ---- | -- | --- | ---- | ----- |
| foo  | 2  | 1   | 0    | 3     |
| bar  | 1  | 2   | 1    | 4     |
  

需要注意的是,语言数量是动态的。但是,如果有人可以提供一套固定的语言解决方案,那是没有问题的。 预先感谢

1 个答案:

答案 0 :(得分:3)

您可以使用crosstab并计算总数

In [223]: pd.crosstab(df.User, df.Language).assign(Total=lambda x: x.sum(axis=1))
Out[223]:
Language  C  CPP  Java  Total
User
bar       1    2     1      4
foo       2    1     0      3

In [247]: df.pivot_table(index='User', columns='Language', values='CodeID', 
                         aggfunc=len).assign(Total=lambda x: x.sum(1))
Out[247]:
Language    C  CPP  Java  Total
User
bar       1.0  2.0   1.0    4.0
foo       2.0  1.0   NaN    3.0

In [250]: df.groupby(['User', 'Language']).size().unstack(fill_value=0)
Out[250]:
Language  C  CPP  Java
User
bar       1    2     1
foo       2    1     0