看过来
《pandas 教程》 持续更新中,提供建议、纠错、催更等加作者微信: gr99123(备注:pandas教程)和关注公众号「盖若」ID: gairuo。跟作者学习,请进入 Python学习课程。欢迎关注作者出版的书籍:《深入浅出Pandas》 和 《Python之光》。
今天我们来看一个在文本处理中最为常见的例子。在收集数据过程,我们有时间习惯将数据简单地将数据整理为 key:value 形式,比如姓名:张三,年龄:18等等。但我们在使用数据时希望将属性作为列,这就涉及到数据格式转换问题,就是本案例要解决的问题。
有这样的一个 DataFrame:
'''
col
A:10,B:20,C:30
A:20,D:50,E:60
'''
如何使这个数据变成:
'''
A B C D E
10 20 30 null null
20 null null 50 60
'''
我们观察,每行的数据很像 Python 的字典结构,我们想办法将文本转换为字典对象,然后再用 pandas 的 DataFrame 构造方法将其转换为 DataFrame。
先利用剪贴板复制数据,读取到 DataFrame:
import pandas as pd
df = pd.read_clipboard()
df
'''
col
0 A:10,B:20,C:30
1 A:20,D:50,E:60
'''
将数据转换为构造字典的代码字符串,形式如 dict(a=1, b=2)
,分为两步:
# 替换冒号
df.col.str.replace(':', '=')
'''
0 A=10,B=20,C=30
1 A=20,D=50,E=60
Name: col, dtype: object
'''
# 加大括号
df.col.str.replace(':', '=').map(lambda x: f'dict({x})')
'''
0 dict(A=10,B=20,C=30)
1 dict(A=20,D=50,E=60)
Name: col, dtype: object
'''
将字符串按代码执行返回字典:
(
df.col.str.replace(':', '=')
.map(lambda x: f'dict({x})')
.map(eval)
)
'''
0 {'A': 10, 'B': 20, 'C': 30}
1 {'A': 20, 'D': 50, 'E': 60}
Name: col2, dtype: object
'''
最后将字典读到 DataFrame 里,利用 apply 的广播机制生成相关的列:
(
df.col.str.replace(':', '=')
.map(lambda x: f'dict({x})')
.map(eval)
.apply(pd.Series)
)
'''
A B C D E
0 10.0 20.0 30.0 NaN NaN
1 20.0 NaN NaN 50.0 60.0
'''
这样就得到了我们想要的结果。
(完)
更新时间:2024-08-18 16:00:05 标签:pandas python 字典 文本