在Python中将一个字符串列拆分为多个列

时间:2018-08-24 04:16:48

标签: python pandas

我有以下数据框:

df = pd.DataFrame({'scene':[{"living":"0.515","kitchen":"0.297"}, {"kitchen":"0.401","study":"0.005"}, {"study":"0.913"}, {}, {"others":"0"}], 'id':[1, 2, 3 ,4, 5]}) 

id        scene
01      {"living":"0.515","kitchen":"0.297"}
02      {"kitchen":"0.401","study":"0.005"}
03      {"study":"0.913"}
04      {}
05      {"others":"0"}

我想创建一个新的数据框,如下所示,有人可以帮助我使用Pandas创建它吗?

id      living     kitchen     study     others
01      0.515       0.297        0         0 
02        0         0.401      0.005       0
03        0           0        0.913       0
04        0           0          0         0 
05        0           0          0         0

4 个答案:

答案 0 :(得分:4)

简单的解决方案是将您的scene列转换为词典列表,并使用默认构造函数创建新的数据框:

pd.DataFrame(df.scene.tolist()).fillna(0)

结果:

  kitchen living others  study
0   0.297  0.515      0      0
1   0.401      0      0  0.005
2       0      0      0  0.913
3       0      0      0      0
4       0      0      0      0

创建DataFrame的“默认”方法之一是使用词典列表。在这种情况下,列表的每个字典都将转换为单独的行,而字典的每个键都将用作列标题。

答案 1 :(得分:2)

根据您的数据

df = pd.DataFrame({'scene':[{"living":"0.515","kitchen":"0.297"}, {"kitchen":"0.401","study":"0.005"}, 
                        {"study":"0.913"}, {}, {"others":"0"}], 
               'id':[1, 2, 3 ,4,5], 's': ['a','b','c','d','e']})

df:
    id  s   scene
0   1   a   {'kitchen': '0.297', 'living': '0.515'}
1   2   b   {'kitchen': '0.401', 'study': '0.005'}
2   3   c   {'study': '0.913'}
3   4   d   {}
4   5   e   {'others': '0'}

您可以通过两种方式进行此操作,

  1. 在一行中,您必须在set_index函数中输入除'scene'以外的所有列名

    df = df.set_index(['id', 's'])['scene'].apply(pd.Series).fillna(0).reset_index()
    

    它将输出:

       id   s   kitchen living  study   others
    0   1   a   0.297   0.515   0       0
    1   2   b   0.401   0       0.005   0
    2   3   c   0       0       0.913   0
    3   4   d   0       0       0       0
    4   5   e   0       0       0       0
    
  2. 在两行中,您将在其中创建例外结果,并将其连接到原始数据框。

    df1 = df.scene.apply(pd.Series).fillna(0)
    df = pd.concat([df, df1], axis=1)
    

    给出,

       id   s                                    scene  kitchen living  study others
    0   1   a   {'kitchen': '0.297', 'living': '0.515'} 0.297   0.515   0     0
    1   2   b    {'kitchen': '0.401', 'study': '0.005'} 0.401   0    0.005    0
    2   3   c                        {'study': '0.913'} 0       0   0.913     0
    3   4   d                                        {} 0       0      0      0
    4   5   e                           {'others': '0'} 0       0      0      0
    

答案 2 :(得分:0)

已更新。这一个完美。欢迎提出您的建议以使其更简洁。

import json
import pandas as pd

df = pd.DataFrame({'scene':[{"living":"0.515","kitchen":"0.297"}, {"kitchen":"0.401","study":"0.005"}, {"study":"0.913"}, {}, {"others":"0"}], 'id':[1, 2, 3 ,4,5], 's':['a','b','c','d','e']}) 
def test(Scene, type):
    Scene = json.loads(Scene)
    if type in Scene.keys():
        return Scene[type]
    else:
        return ""

a = ['living', 'kitchen', 'study', 'others']
for b in a:
    df[b] = df['Scene'].map(lambda Scene: test(Scene, b.lower()))

cols = ['living', 'kitchen', 'study', 'others']
df[cols] = df[cols].replace({'': 0})
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce', axis=1)

答案 3 :(得分:0)

一个完美的一线解决方案就在这里,感谢所有帮助:

df.join(df['scene'].apply(json.loads).apply(pd.Series))