我正在尝试创建某些分组对象的直方图。因此,为了提供一些上下文,我有一个主数据框df
,我根据一些值对其进行查询并将其分配给df_q
。现在有了df_q
,我创建了一个索引来识别这个组。我现在想做的是获取特定列的每个项目的值计数。所以如果我有:
In [128]: df_q
Out[128]:
annual_base_delta_range_ten annual_base_delta_range_three
row_id
10010 3 5
10010 5 11
10010 6 15
10010 5 11
10010 5 11
10010 5 12
10010 6 14
10010 6 16
10010 4 9
10010 4 9
我知道我可以在每个系列上做这样的事情:
In [129]: df_q.annual_base_delta_range_ten.value_counts()
Out[129]:
5 4
6 3
4 2
3 1
Name: annual_base_delta_range_ten, dtype: int64
但是我想要一个看起来像df_q
的数据帧(即,相同的row_id
索引和相同的列名,并添加了两列新的值计数列(。
编辑
以下是我希望我想要的结果的样子:
delta_ten | delta_10_count | delta_three | delta_three_count
3 1 5 1
4 2 9 2
5 4 11 3
等等...以及所有相同的row_id。
您可以使用源列作为合并键,将原始数据框与每个value_counts
系列合并(即联接(。
col = 'annual_base_delta_range_ten'
df.merge(df[col].value_counts().to_frame('{}_value_counts'.format(col)),
left_on='annual_base_delta_range_ten', right_index=True)
annual_base_delta_range_ten annual_base_delta_range_three annual_base_delta_range_ten_value_counts
row_id
10010 3 5 1
10010 5 11 4
10010 5 11 4
10010 5 11 4
10010 5 12 4
10010 6 15 3
10010 6 14 3
10010 6 16 3
10010 4 9 2
10010 4 9 2
一个简单的答案,但不是单行的,将 value_counts(( 与 map 一起使用。编辑:正如@Igor Raush建议的那样,我们可以传递一个系列来映射,因此to_dict没有必要。
val_count_ten = df.annual_base_delta_range_ten.value_counts()
val_count_three = df.annual_base_delta_range_three.value_counts()
df['val_count_ten'] = df.annual_base_delta_range_ten.map(val_count_ten)
df['val_count_three'] = df.annual_base_delta_range_three.map(val_count_three)
给你
row_id annual_base_delta_range_ten annual_base_delta_range_three val_count_ten val_count_three
0 10010 3 5 1 1
1 10010 5 11 4 3
2 10010 6 15 3 1
3 10010 5 11 4 3
4 10010 5 11 4 3
5 10010 5 12 4 1
6 10010 6 14 3 1
7 10010 6 16 3 1
8 10010 4 9 2 2
9 10010 4 9 2 2