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使用可以是另一个系列、字典或函数的输入来映射一个系列的值。因此,这里我们将值计数的输出映射到列