Pandas,DataFrame:将一列拆分为多列

14
我有以下数据框,想知道是否可以将data列分成多个列。例如,从这个:
ID       Date       data
6       21/05/2016  A: 7, B: 8, C: 5, D: 5, A: 8
6       21/01/2014  B: 5, C: 5, D: 7
6       02/04/2013  A: 4, D:7
7       05/06/2014  C: 25
7       12/08/2014  D: 20
8       18/04/2012  A: 2, B: 3, C: 3, E: 5, B: 4
8       21/03/2012  F: 6, B: 4, F: 5, D: 6, B: 4  
转变为这个:
ID       Date       data                            A   B   C   D   E   F
6       21/05/2016  A: 7, B: 8, C: 5, D: 5, A: 8    15  8   5   5   0   0 
6       21/01/2014  B: 5, C: 5, D: 7                0   5   5   7   0   0     
6       02/04/2013  A: 4, D:7                       4   10  0   7   0   0
7       05/06/2014  C: 25                           0   0   25  0   0   0
7       12/08/2014  D: 20                           0   0   0   20  0   0   
8       18/04/2012  A: 2, B: 3, C: 3, E: 5, B: 4    2   7   3   0   5   0
8       21/03/2012  F: 6, B: 4, F: 5, D: 6, B: 4    0   12  0   6   0   11 
8       18/04/2012  A: 2, B: 3, C: 3, E: 5, B: 4    2   7   3   0   5   0
8       21/03/2012  F: 6, B: 4, F: 5, D: 6, B: 4    0   8   0   6   0   11

我已经尝试了Split strings in tuples into columns, in Pandaspandas: How do I split text in a column into multiple rows?,但它们在我的情况下无法工作。

编辑

数据列有一定的复杂性,例如在第一行中,A重复出现,因此这些值在A列下相加(请参见第二个表格)。

2个回答

11

这里有一个函数,它可以将字符串转换为字典并根据键聚合值;转换后,使用 pd.Series 方法轻松获得结果:

def str_to_dict(str1):
    import re
    from collections import defaultdict
    d = defaultdict(int)
    for k, v in zip(re.findall('[A-Z]', str1), re.findall('\d+', str1)):
        d[k] += int(v)
    return d

pd.concat([df, df['dictionary'].apply(str_to_dict).apply(pd.Series).fillna(0).astype(int)], axis=1)

这里输入图片描述


5
df = pd.DataFrame([
        [6, "a: 1, b: 2"],
        [6, "a: 1, b: 2"],
        [6, "a: 1, b: 2"],
        [6, "a: 1, b: 2"],
    ], columns=['ID', 'dictionary'])

def str2dict(s):
    split = s.strip().split(',')
    d = {}
    for pair in split:
        k, v = [_.strip() for _ in pair.split(':')]
        d[k] = v
    return d

df.dictionary.apply(str2dict).apply(pd.Series)

在此输入图片描述

或者:

pd.concat([df, df.dictionary.apply(str2dict).apply(pd.Series)], axis=1)

enter image description here


这只会给你一个系列,不会分成多个列。 - user1124825
@user1124825 我编辑了答案,加入了一个字符串解析器。你最初的问题提到标记为“dictionary”的列是一个字典列。我假设这是正确的。通过应用解析器,我的答案仍然适用。 - piRSquared

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