我试图创建某些分组对象的直方图。因此,为了给出一些上下文,我有一个主数据框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。
答案 0 :(得分:1)
您可以使用源列作为合并键,将原始数据框与每个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
答案 1 :(得分:1)
一个简单的答案,但不是一个单行,使用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