【问题标题】:How to convert rows into columns and filter using the ID如何将行转换为列并使用 ID 进行过滤
【发布时间】:2021-07-18 15:49:49
【问题描述】:

我有一个如下所示的 CSV 文件:

customer_id |  key_id.  |  quantity |
1           |    777    |    3      |
1           |    888    |    2      |
1           |    999    |    3      |
2           |    777    |    6      |
2           |    888    |    1      |

我想使用简单的 python 或 pandas 来:

  1. 将每个唯一的客户 ID 放在单独的行中
  2. 将 key_id 转换为列标题,值是数量

输出表应如下所示:

            |  777    |  888  |   999  | 
1           |   3     |   2   |    3   |
2           |   6     |   1   |    0   |

我一直在努力寻找一个好的数据结构来做到这一点,但我做不到。并且使用熊猫我也无法使用 2 个 ID 进行过滤。有什么建议吗?

【问题讨论】:

    标签: python python-3.x pandas dataframe csv


    【解决方案1】:

    您可以使用pivot_table() 转入key_id 列:

    df.pivot_table(index='customer_id', columns='key_id', values='quantity').fillna(0)
    
    # key_id       777  888  999
    # customer_id               
    # 1            3.0  2.0  3.0
    # 2            6.0  1.0  0.0
    

    为了处理重复,pivot_table() 默认对它们进行平均。要覆盖此聚合方法,您可以设置aggfunc 参数(maxminfirstlastsum 等):

    df.pivot_table(
        index='customer_id',
        columns='key_id',
        values='quantity',
        aggfunc='max',
    ).fillna(0)
    

    【讨论】:

    • @codeDojo 是样本数据还是真实数据?
    • 与真实数据
    • 谢谢。这就是我想做的。但我所有的数量值都是整数。但是在新的 df 中有 3.5、2.1 等值。浮点数是从哪里来的?
    • 根据您的原始错误,您似乎有一些重复的 customer_id-key_id 对。在这种情况下,pivot_table() 会为您平均欺骗。如果您更喜欢不同的聚合方法,可以设置aggfunc 参数。
    • 在示例数据中,之所以变成float,是因为有些值在我们fillna()之前最初是nan,所以都先转换为float
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2022-11-03
    • 2014-05-26
    • 2011-05-23
    相关资源
    最近更新 更多