Pandas:使用 group by,将多个列值组合为 groupby 中的一个不同组

问题描述 投票:0回答:3

我有一个数据框,我在特定列上使用

pandas.groupby
,然后对生成的组运行聚合统计(平均值、中位数、计数)。我想将某些列值视为由 groupby 生成的同一组的成员,而不是用于分组的列中每个不同值的不同组。我正在考虑如何完成这样的事情。

例如:

>> my_df
ID    SUB_NUM     ELAPSED_TIME
1     1           1.7
2     2           1.4
3     2           2.1 
4     4           3.0
5     6           1.8
6     6           1.2

因此,而不是典型的行为:

>> my_df.groupby([SUB_NUM]).agg([count])
ID    SUB_NUM     Count
1     1           1
2     2           2
4     4           1
5     6           2 

我希望将某些值([1, 2] 中的 SUB_NUM)作为一组进行计算,因此会生成如下所示的内容:

>> # Some mystery pandas function calls
ID    SUB_NUM     Count
1     1, 2        3
4     4           1
5     6           2

任何帮助将不胜感激,谢谢!

python pandas dataframe group-by
3个回答
5
投票

对我来说有效:

#for join values convert values to string
df['SUB_NUM'] = df['SUB_NUM'].astype(str)
#create mapping dict by dict comprehension
L = ['1','2']
d = {x: ','.join(L) for x in L}
print (d)
{'2': '1,2', '1': '1,2'}

#replace values by dict
a = df['SUB_NUM'].replace(d)
print (a)
0    1,2
1    1,2
2    1,2
3      4
4      6
5      6
Name: SUB_NUM, dtype: object


#groupby by mapping column and aggregating `first` and `size`
print (df.groupby(a)
         .agg({'ID':'first', 'ELAPSED_TIME':'size'})
         .rename(columns={'ELAPSED_TIME':'Count'})
         .reset_index())

  SUB_NUM  ID  Count
0     1,2   1      3
1       4   4      1
2       6   5      2

大熊猫的大小和数量有什么区别?


1
投票

您可以创建另一列,将

SUB_NUM
值映射到实际组,然后按其分组。

my_df['SUB_GROUP'] = my_df['SUB_NUM'].apply(lambda x: 1 if x < 3 else x)
my_df.groupby(['SUB_GROUP']).agg([count])

0
投票

作为

by
中的
groupby
参数,您可以使用接受数据帧索引并返回新索引的函数。也许在这个例子中它没有太多优势,但在更复杂的逻辑中它是值得的:

def func(idx):
    if idx in (1, 2):
        return 1
    else:
        return idx

df.set_index('SUB_NUM', drop=False, inplace=True) # we want to groupby by this column
df.groupby(func).agg({'ID': 'first', 'SUB_NUM': set})

输出:

         ID SUB_NUM
SUB_NUM            
1         1  {1, 2}
4         4     {4}
6         5     {6}
© www.soinside.com 2019 - 2024. All rights reserved.