如何在 Pandas 数据框中对某一列的数值进行拆分?

3

我有一个包含公司ID的列df,如何将这些ID拆分为多个列?

该列中的值可以是0(NaN)到5个以上的ID,如何将每个ID拆分到不同的列中?

以下是该列的示例:

0                                                  4773300
1                                                      NaN
2                                  6201501,6319400,6202300
3                                                  8230001
4                                                      NaN
5           4742300,4744004,4744003,7319002,4729699,475470

列A 列B 列C
4773300
6201501 6319400 6202300
8230001

根据逗号进行分割,我想象中的输出是这样的:

根据ID数量不同,输出会有所变化。


如果有超过3列,你打算如何处理?你会事先设置列数吗? - DollarAkshay
想法是为每个值创建一个新列。 - Marjorie
2个回答

3
你可以使用.str.split方法轻松执行这种类型的转换。诀窍是传递expand=True参数,使结果放入一个DataFrame而不是包含列表对象的Series中。
>>> df
                                               ID
0                                         4773300
1                                             NaN
2                         6201501,6319400,6202300
3                                         8230001
4                                             NaN
5  4742300,4744004,4744003,7319002,4729699,475470


>>> df['ID'].str.split(',', expand=True)
         0        1        2        3        4       5
0  4773300     None     None     None     None    None
1      NaN      NaN      NaN      NaN      NaN     NaN
2  6201501  6319400  6202300     None     None    None
3  8230001     None     None     None     None    None
4      NaN      NaN      NaN      NaN      NaN     NaN
5  4742300  4744004  4744003  7319002  4729699  475470

为了更好地提高美观度,您还可以对输出进行一些清理

  • 将None替换为NaN
  • 使用字母列名(尽管我建议不要这样做,因为如果ID列的给定条目有>26个ID,则会出现错误)
  • 与原始DataFrame重新连接
>>> import pandas as pd
>>> from string import ascii_uppercase
>>> (
    df['ID'].str.split(',', expand=True)
    .replace({None: float('nan')})
    .pipe(lambda d: 
        d.set_axis(
            pd.Series(list(ascii_uppercase))[d.columns], 
            axis=1
        )
    )
    .add_prefix("column")
    .join(df)
)

   columnA  columnB  columnC  columnD  columnE columnF                                              ID
0  4773300      NaN      NaN      NaN      NaN     NaN                                         4773300
1      NaN      NaN      NaN      NaN      NaN     NaN                                             NaN
2  6201501  6319400  6202300      NaN      NaN     NaN                         6201501,6319400,6202300
3  8230001      NaN      NaN      NaN      NaN     NaN                                         8230001
4      NaN      NaN      NaN      NaN      NaN     NaN                                             NaN
5  4742300  4744004  4744003  7319002  4729699  475470  4742300,4744004,4744003,7319002,4729699,475470

这似乎可行!你能使用append方法将这些新列连接到数据集的其余部分吗? - Marjorie
你可以使用.join来完成这个任务。我刚刚更新了我的答案,加入了一些数据清洗技巧以及使用.join将这些新列重新连接到原始DataFrame的用法。 - Cameron Riddell
这个错误出现在字符串库中:"ImportError: cannot import name 'asccii_uppercase' from 'string'"。我们如何将“Column1,Column2,...”列中的内容更改为数字? - Marjorie
抱歉,那是我的笔误。正确的导入应该是 from string import ascii_uppercase - Cameron Riddell
很遗憾,这个错误返回了,我承认我没有理解。KeyError:'[26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98] 不在索引中这可能与列数有关吗? - Marjorie
显示剩余3条评论

0

将每个条目视为字符串,并解析该字符串以获取各个值。

from ast import literal_eval
df = pd.read_csv('sample.csv', converters={'company': literal_eval})

words = []
for items in df['company']:
    for word in items:
        words.append(word)

顺便说一下,这是一个很好的起点。目前我不知道需要什么样的输出格式,因为你的问题有点不完整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接