pandas - 如何在熊猫中将一列拆分为三列
问题描述
我有一个如下所示的数据框
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'])
但是再次从上面我必须通过对列进行切片来清理数据。我想知道有没有比这更简单的方法。
解决方案
将列表推导与字典推导一起用于字典列表并传递给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
推荐阅读
- web - 403 - 禁止:访问被拒绝。让我的网站显示
- python - 如何将机器人添加到电报组并获取组 ID?
- javascript - 如何从 Vue.js 中的方法向函数传递值?
- html - 如何防止滚动减小块的宽度?
- java - 如何在 Jtable 上转义 \n
- go - libDolphinDBAPI.so:对“RSA_public_decrypt”的未定义引用
- docker - 如何从 dockerfile 启动 Docker Compose 并一起运行 curl
- machine-learning - 如何在 keras 中保存和重用一种热编码?
- decode - 如何将 Nanodet 的 6 个输出解码为识别结果
- apache-spark - 使用编码 utf-16le 从 csv 加载数据