首页 > 解决方案 > 如何在熊猫中将一列拆分为三列

问题描述

我有一个如下所示的数据框

ID  Name     Address
1   Kohli    Country: India; State: Delhi; Sector: SE25
2   Sachin   Country: India; State: Mumbai; Sector: SE39
3   Ponting  Country: Australia; State: Tasmania 
4   Ponting  State: Tasmania; Sector: SE27

从上面我想准备下面的数据框

ID  Name     Country   State     Sector
1   Kohli    India     Delhi     SE25
2   Sachin   India     Mumbai    SE39
3   Ponting  Australia Tasmania  None
4   Ponting  None      Tasmania  SE27

我试过下面的代码

df[['Country', 'State', 'Sector']] = pd.DataFrame(df['ADDRESS'].str.split(';',2).tolist(),
                                   columns = ['Country', 'State', 'Sector'])

但是再次从上面我必须通过对列进行切片来清理数据。我想知道有没有比这更简单的方法。

标签: pandas

解决方案


将列表推导与字典推导一起用于字典列表并传递给DataFrame构造函数:

L = [{k:v for y in x.split('; ')  for k, v in dict([y.split(': ')]).items()} 
          for x in df.pop('Address')]

df = df.join(pd.DataFrame(L, index=df.index))
print (df)
   ID     Name    Country     State Sector
0   1    Kohli      India     Delhi   SE25
1   2   Sachin      India    Mumbai   SE39
2   3  Ponting  Australia  Tasmania    NaN

split与 reshape 一起使用stack

df1 = (df.pop('Address')
         .str.split('; ', expand=True)
         .stack()
         .reset_index(level=1, drop=True)
         .str.split(': ', expand=True)
         .set_index(0, append=True)[1]
         .unstack()
         )
print (df1)
0    Country Sector     State
0      India   SE25     Delhi
1      India   SE39    Mumbai
2  Australia    NaN  Tasmania

df = df.join(df1)
print (df)
   ID     Name    Country Sector     State
0   1    Kohli      India   SE25     Delhi
1   2   Sachin      India   SE39    Mumbai
2   3  Ponting  Australia    NaN  Tasmania

推荐阅读