我有一个数据框,我在特定列上使用
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
任何帮助将不胜感激,谢谢!
对我来说有效:
#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
您可以创建另一列,将
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])
作为
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}