【问题标题】:Count specific value for IDs in two dataframes计算两个数据帧中 ID 的特定值
【发布时间】:2019-02-20 20:14:17
【问题描述】:

我有两个数据框

df1

+----+-------+
|    |   Key |
|----+-------|
|  0 |    30 |
|  1 |    31 |
|  2 |    32 |
|  3 |    33 |
|  4 |    34 |
|  5 |    35 |
+----+-------+

df2

+----+-------+--------+
|    |   Key | Test   |
|----+-------+--------|
|  0 |    30 | Test4  |
|  1 |    30 | Test5  |
|  2 |    30 | Test6  |
|  3 |    31 | Test4  |
|  4 |    31 | Test5  |
|  5 |    31 | Test6  |
|  6 |    32 | Test3  |
|  7 |    33 | Test3  |
|  8 |    33 | Test3  |
|  9 |    34 | Test1  |
| 10 |    34 | Test1  |
| 11 |    34 | Test2  |
| 12 |    34 | Test3  |
| 13 |    34 | Test3  |
| 14 |    34 | Test3  |
| 15 |    35 | Test3  |
| 16 |    35 | Test3  |
| 17 |    35 | Test3  |
| 18 |    35 | Test3  |
| 19 |    35 | Test3  |
+----+-------+--------+

我想计算每个Test 为每个Key 列出了多少次。

+----+-------+-------+-------+-------+-------+-------+-------+
|    |   Key | Test1 | Test2 | Test3 | Test4 | Test5 | Test6 |
|----+-------|-------|-------|-------|-------|-------|-------|
|  0 |    30 |       |       |       |   1   |   1   |   1   |
|  1 |    31 |       |       |       |   1   |   1   |   1   |
|  2 |    32 |       |       |   1   |       |       |       |
|  3 |    33 |       |       |   2   |       |       |       |
|  4 |    34 |   2   |   1   |   3   |       |       |       |
|  5 |    35 |       |       |   5   |       |       |       |
+----+-------+-------+-------+-------+-------+-------+-------+

我的尝试

使用 join 和 groupby,我首先得到了每个 Key 的计数,而不考虑 Test

result_df = df1.join(df2.groupby('Key').size().rename('Count'), on='Key')


+----+-------+---------+
|    |   Key |   Count |
|----+-------+---------|
|  0 |    30 |       3 |
|  1 |    31 |       3 |
|  2 |    32 |       1 |
|  3 |    33 |       2 |
|  4 |    34 |       6 |
|  5 |    35 |       5 |
+----+-------+---------+

我尝试将KeyTest 分组

result_df = df1.join(df2.groupby(['Key', 'Test']).size().rename('Count'), on='Key')

但这会返回错误

ValueError: len(left_on) must equal the number of levels in the index of "right"

【问题讨论】:

    标签: python-3.x pandas join group-by


    【解决方案1】:

    检查crosstab

    pd.crosstab(df2.Key,df2.Test).reindex(df1.Key).replace({0:''})
    

    【讨论】:

      【解决方案2】:

      这里是 groupby 和 pivot 的另一个解决方案。使用此解决方案,您根本不需要 df1。

      # | create some dummy data
      tests = ['Test' + str(i) for i in range(1,7)]
      df = pd.DataFrame({'Test': np.random.choice(tests, size=100), 'Key': np.random.randint(30, 35, size=100)})
      df['Count Variable'] = 1
      
      # | group & count aggregation
      df = df.groupby(['Key', 'Test']).count()
      df = df.pivot(index="Key", columns="Test", values="Count Variable").reset_index()
      

      【讨论】:

        猜你喜欢
        • 2019-05-29
        • 2022-01-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-15
        • 2017-05-28
        • 1970-01-01
        • 2021-03-17
        相关资源
        最近更新 更多