【问题标题】:Create Multiple New Columns Based on Pipe-Delimited Column in Pandas在 Pandas 中基于管道分隔列创建多个新列
【发布时间】:2017-12-28 15:24:01
【问题描述】:

我有一个带有管道分隔列的 pandas 数据框,其中包含任意数量的元素,称为 Parts。这些管道串中的元素数量从 0 到超过 10 个不等。所有管道串中包含的唯一元素的数量并不比行数小很多(这使得我无法手动指定所有这些元素,而创建新列)。

对于每一行,我想创建一个新列,作为管道分隔列表中每个元素的指示变量。例如,如果行

...'Parts'...

...'12|34|56'

应该转化为

...'Part_12' 'Part_34' 'Part_56'...

...1 1 1...

因为它们是许多独特的部分,所以这些列显然是稀疏的 - 大部分是零,因为每一行只包含一小部分独特的部分。

我没有找到任何不需要手动指定列的方法(例如,Pandas Dataframe: split column into multiple columns, right-align inconsistent cell entries)。 我也看过 pandas 的融化,但我认为那不是合适的工具。

我知道如何解决它的方法是将原始 CSV 传输到另一个 python 脚本并逐个字符地处理它,但我需要在现有脚本中工作,因为我将处理数百个以这种方式保存 CSV。

这里有一个更好的数据说明

ID YEAR AMT PARTZ

1202 2007 99.34

9321 1988 1012.99 2031|8942

2342 2012 381.22 1939|8321|Amx3

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    您可以使用get_dummiesadd_prefix

    df.Parts.str.get_dummies().add_prefix('Part_')
    

    输出:

       Part_12  Part_34  Part_56
    0        1        1        1
    

    编辑评论和计算重复项。

    df = pd.DataFrame({'Parts':['12|34|56|12']}, index=[0])
    pd.get_dummies(df.Parts.str.split('|',expand=True).stack()).sum(level=0).add_prefix('Part_')
    

    输出:

       Part_12  Part_34  Part_56
    0        2        1        1
    

    【讨论】:

    • 这真的很优雅。但是,它似乎不计算重复项(例如 12|12|34)
    • @MikePalmice pd.get_dummies(df.Parts.str.split('|',expand=True).stack()).sum(level=0).add_prefix('Part_')
    • 这两种解决方案产生了不同维度的数据框——特别是第二种解决方案的行数为 25%。索引是 0,3,6,7,9 等
    • 您介意用更可靠的数据开始一个新问题吗?
    • 没问题,这是链接-stackoverflow.com/questions/48014555/…。我注意到排除的索引对于Parts 有空值。因此,您修改后的解决方案的唯一“问题”是它产生 NaN 而不是 0。但是,在所有以“Part_”开头的列中,用 0 替换 NaN 应该很容易。 (在 Excel 中而不是从 shell 中检查结果是我的错误!)
    猜你喜欢
    • 2018-09-22
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2021-03-17
    相关资源
    最近更新 更多