如何获取数据框指定列中每个项目的值计数并仍保持索引?

时间:2017-04-06 23:22:17

标签: python pandas

我试图创建某些分组对象的直方图。因此,为了给出一些上下文,我有一个主数据框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。

2 个答案:

答案 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