在多列上使用pandas groupby函数

时间:2015-07-21 18:41:26

标签: python pandas

我有一个类似于此的DataFrame:

Key    Departure    Species1   Species2   Status
1         R          Carlan     Carlan      D
1         R          Scival     Carex       C
2         R          Carlan     Scival      D
2         R          Scival     Bougra      C  
3         D          Carlan     Carlan      D
3         D          Scival     Scival      C

我想计算Species1 Departure Status的{​​{1}}和D的每个唯一C的出现次数

我想要的输出是:

Species1   RD    RC    DD    DC
Carlan     2     NaN   1     NaN
Scival     NaN   2     NaN   1

3 个答案:

答案 0 :(得分:3)

创建一个新的列,它是Departure和Status

的组合
df['comb'] = df.Departure + df.Status
df
#  Key Departure Species1 Species2 Status comb
#0   1         R   Carlan   Carlan      D   RD
#1   1         R   Scival    Carex      C   RC
#2   2         R   Carlan   Scival      D   RD
#3   2         R   Scival   Bougra      C   RC
#4   3         D   Carlan   Carlan      D   DD
#5   3         D   Scival   Scival      C   DC

然后你可以分组:

gb    = df.groupby(['Species1', 'comb'])
gb.groups
#{('Carlan', 'DD'): [4],
#('Carlan', 'RD'): [0, 2],
#('Scival', 'DC'): [5],
#('Scival', 'RC'): [1, 3]}

现在将结果组织到一个列表中,其中每个元素都是一个元组(column, Series(data, index)),表示新数据帧中的单个数据点

items = [ (key[1], pandas.Series( [len(val)], index=[key[0]] ) )for key,val in gb.groups.items() ]

从项目中创建一个新的数据框:

result = pandas.from_items( items)
result
#        RC  DC  DD  RD
#Carlan NaN NaN   1   2
#Scival   2   1 NaN NaN

额外信息

有关从各种对象创建新数据框的提示,请参阅this link。如果要从各个数据点创建数据框(例如(Species1,comb)),则from_items是最佳选择。

答案 1 :(得分:2)

使用 pandas.crosstab()方法。一行代码:

pd.crosstab(df.Species1, [df.Departure, df.Status])

结果表:

enter image description here

如果你与@ dermen的'梳子'栏结合,

df['comb'] = df.Departure + df.Status
pd.crosstab(df.Species1, df.comb)

你会得到:

enter image description here

如果确实想要那些'NaN',那么只需要.replace('0', np.nan),就像这样(假设import numpy as np已经完成):

pd.crosstab(df.Species1, df.comb).replace('0', np.nan)

enter image description here

答案 2 :(得分:0)

您可以在多个列上使用a groupby查询,并使用.agg函数计算出现次数:

df.groupby(['Species1', 'Departure', 'Status']).agg(['count'])