python - 根据分隔符拆分字符串列并将其转换为 Pandas 中的 dict 而无需循环
问题描述
我有以下数据框
clm1, clm2, clm3
10, a, clm4=1|clm5=5
11, b, clm4=2
我想要的结果是
clm1, clm2, clm4, clm5
10, a, 1, 5
11, b, 2, Nan
我试过下面的方法
rows = list(df.index)
dictlist = []
for index in rows: #loop through each row to convert clm3 to dict
i = df.at[index, "clm3"]
mydict = dict(map(lambda x: x.split('='), [x for x in i.split('|') if '=' in x]))
dictlist.append(mydict)
l=json_normalize(dictlist) #convert dict column to flat dataframe
resultdf = example.join(l).drop('clm3',axis=1)
这给了我想要的结果,但我正在寻找一种更有效的方法将 clm3 转换为 dict ,它不涉及遍历每一行。
解决方案
用于str.extractall
获取您的值并将unstack
它们转换为每个唯一值的列。
并str.get_dummies
为每个唯一的clm
.
values = (
df['clm3'].str.extractall('(=\d)')[0]
.str.replace('=', '')
.unstack()
.rename_axis(None, axis=1)
)
columns = df['clm3'].str.replace('=\d', '').str.get_dummies(sep='|').columns
values.columns = columns
dfnew = pd.concat([df[['clm1', 'clm2']], values], axis=1)
clm1 clm2 0 1
0 10 a 1 5
1 11 b 2 NaN
推荐阅读
- python - 在python的字典中以日期格式dd-mm-yyyy插入一个值
- c# - c#复制多个文件
- dialogflow-es - DialogFlow PermissionDenied:403 IAM 权限“dialogflow.sessions.detectIntent”
- html - 根据第一列的值更改 HTML 表格中的行背景
- python - 如何找到函数 $f(\beta) = \gamma + [1-e^{-j\beta}]/[1-e^{(-j+1)\beta}]$ 的根,使用蟒蛇
- c++ - MRPT Graph Slam 最小示例
- sql - 使用 IF 语句为条目拉取布尔列标题
- assembly - 为什么内存(x86 / nasm)中的数据段之间有空的地址空间?
- d3.js - 在系列图中使用画笔时饼图未正确更新
- google-apps-script - 如何在团队驱动器中的服务帐户创建的电子表格中使用 GAS 功能?