基于分隔符拆分字符串列,并在无循环的情况下将其转换为dict

2024-09-28 01:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有下面的数据框

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,而不涉及每一行的循环


Tags: to方法inconvertdfforindexdict
2条回答

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

两个步骤:

其思想是创建一个双重拆分,然后按索引分组,并将值作为列取消堆叠

s = (
    df["clm3"]
    .str.split("|", expand=True)
    .stack()
    .str.split("=", expand=True)
    .reset_index(level=1, drop=True)
)

final = pd.concat([df, s.groupby([s.index, s[0]])[1].sum().unstack()], axis=1).drop(
    "clm3", axis=1
)

print(final)
   clm1 clm2  clm4 clm5
0    10    a     1    5
1    11    b     2  NaN

相关问题 更多 >

    热门问题