在多个列上使用pandas groupby函数

2024-05-22 09:37:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个类似的数据帧:

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

我想计算给定的DepartureDC中每个唯一的Species1的出现次数

我想要的输出是:

^{pr2}$

Tags: 数据keystatus次数departurepr2carexcarlan
3条回答

可以对多个列使用a groupby查询,然后使用聚集函数计算发生次数:

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

使用熊猫.交叉表()方法。一行代码:

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

结果表:

enter image description here

如果你和@dermen的“梳子”栏结合

^{pr2}$

您将获得:

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

创建一个新列,该列是离开和状态的组合

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

然后您可以按以下方式分组:

^{pr2}$

现在将结果组织到一个列表中,其中每个元素是一个元组(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是您的最佳选择。在

相关问题 更多 >