Python 如何在数据帧的指定列中获取每个项的值计数,并且仍然保持索引?
我正在尝试创建特定分组对象的直方图。因此,为了给出一些上下文,我有一个主数据框Python 如何在数据帧的指定列中获取每个项的值计数,并且仍然保持索引?,python,pandas,Python,Pandas,我正在尝试创建特定分组对象的直方图。因此,为了给出一些上下文,我有一个主数据框df,我根据一些值查询它,并将其分配给df\u q。现在使用df_q,我创建了一个索引来标识这个组。我现在想做的是获取特定列中每个项的值计数。因此,如果我有: In [128]: df_q Out[128]: annual_base_delta_range_ten annual_base_delta_range_three row_id 10010
df
,我根据一些值查询它,并将其分配给df\u 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
等等。。。而且也有相同的行id 您可以使用源列作为合并键,将原始数据帧与每个值\u计数
系列合并(即加入)
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)
年基本增量范围十年基本增量范围三年基本增量范围十值计数
行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所建议的,我们可以将一个系列传递给map,这样就不需要编辑了
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
太好了,我知道合并应该完成,但我不能就这么做。还有一个问题,您如何建议删除重复项?我不介意有更多的空白列来满足邻居的要求(delta_range_三),但是额外的数字看起来很简单unpythonic@Maksim,对不起,我不明白。你指的是什么副本?你能用你的样本数据的期望输出更新你的问题吗?我指的是如何存在相同数量的重复值计数。理想情况下,我希望它只是有一个排序列,每个列旁边都有一个计数。所以*_range_ten应该只有一个3,4,5和6。它的邻居计数列应该有,1,2,4和3。这更清楚吗?很好的解决方案。请注意,您可以将序列传递给
map()
,因此不需要将传递给dict()
。另外,df.assign(val\u count\u ten=…,val\u count\u three=…)
可以将此转换为(长)一行。@Igor Raush,感谢您的输入。是的,我没想过直接在系列中使用地图:)你能解释一下这是怎么回事吗?另外,to_dict()也是一个属性是什么?我可以改用我自己的dict吗?Pandas Series.map使用可以是另一个系列、字典或函数的输入来映射一个系列的值。因此,这里我们将值计数的输出映射到列