首页 > 解决方案 > 根据分隔符拆分字符串列并将其转换为 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 ,它不涉及遍历每一行。

标签: pythonpandasdataframe

解决方案


用于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

推荐阅读