如何获取数据帧指定列中每个项目的值计数并仍然维护索引



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

最新更新