python-3.x - 根据键值熊猫拆分数据框列
问题描述
我有一个这样的数据框:
Id Column Val1 Val2
0 Cust=abc,Region Info=xyz,Data=123 0.0 NaN
1 Cust=abd,Region Info=xyz,Data=124 1.0 750.0
2 Cust=acc hit,Data=125 3.0 400.0
3 Cust=abc,Region Info=xyz,Data=126 NaN 200.0
4 Cust=abg nss,Region Info=xaz,Data=127 -1.0 420.0
5 Cust=evc,Region Info=atz 2.0 NaN
我想将数据框转换为:
Id Column Val1 Val2 Cust Region Info Data
0 Cust=abc,Region Info=xyz,Data=123 0.0 NaN abc xyz 123.0
1 Cust=abd,Region Info=xyz,Data=124 1.0 750.0 abd xyz 124.0
2 Cust=acc hit,Data=125 3.0 400.0 acc hit NaN 125.0
3 Cust=abc,Region Info=xyz,Data=126 NaN 200.0 abc xyz 126.0
4 Cust=abg nss,Region Info=xaz,Data=127 -1.0 420.0 abg nss xaz 127.0
5 Cust=evc,Region Info=atz 2.0 NaN evc atz NaN
从this other question,我得到了部分答案。
但是如何处理键和值中的空格?
编辑:可能有多个键值对(示例中显示的除外)。所以我需要处理任何“n”个列的案例。
解决方案
Series.str.findall
我们可以使用str.findall
正则表达式捕获组从列中提取key-value
对Id Column
df.join(pd.DataFrame(map(dict, df['Id Column'].str.findall(r'([^=,]+)=([^,]+)'))))
Id Column Val1 Val2 Cust Region Info Data
0 Cust=abc,Region Info=xyz,Data=123 0.0 NaN abc xyz 123
1 Cust=abd,Region Info=xyz,Data=124 1.0 750.0 abd xyz 124
2 Cust=acc hit,Data=125 3.0 400.0 acc hit NaN 125
3 Cust=abc,Region Info=xyz,Data=126 NaN 200.0 abc xyz 126
4 Cust=abg nss,Region Info=xaz,Data=127 -1.0 420.0 abg nss xaz 127
5 Cust=evc,Region Info=atz 2.0 NaN evc atz NaN
Regex
细节
([^=,]+)
: 第一个捕获组[^=,]+
:匹配列表中不存在的任何字符[=,]
一次或多次
=
=
:从字面上匹配字符([^,]+)
: 第二个捕获组[^,]+
:匹配列表中不存在的任何字符[,]
一次或多次
见网上regex demo
推荐阅读
- python - 如何有效地替换 pandas 列中日期时间值的时间部分?
- swift - 如何在文本字段中显示学校 ID?
- python - 使用日历视图构建动态日历失败
- r - 使用 dplyr 过滤多个列
- javascript - 修改 gulpfile 以读取子文件夹中的 html 文件并将它们吐出以构建文件夹
- python - 如何在循环其他输入列表时输出多个列表?
- c# - 如何获取 PowerShell JEA 客户端 IP 地址
- javascript - 为什么我不能通过引用变量代理原始函数?
- typescript - 如何从我的应用程序中正确调用 HTTPs 可调用函数?
- java - 多线程遗留 Java 应用程序的线程按顺序轮流