我在数据框 df 列中有以下字符串
混合 |
---|
[84726gsdid=22,name=max,age=33] |
[ieiuf8382id=21,name=kris,age=32] |
我想将列 ID、名称和年龄添加到数据框中,如下所示
id | 名称 | 年龄 |
---|---|---|
22 | 最大 | 33 |
21 | 克里斯 | 32 |
我试过了
df.id = df.mix.str.extract('(id=.*(?=,))')
但不工作
答案 0 :(得分:3)
如果字符串格式是固定的,那么只需使用 str.extact
data = {'mix': {0: '84726gsdid=22,name=max,age=33',
1: '[ieiuf8382id=21,name=kris,age=32]',
# 2: 'id=23,age=20'
}}
df = pd.DataFrame(data)
dfn = df['mix'].str.extract('id=(\d+),name=(\w+),age=(\d+)')
dfn.columns = ['id', 'name', 'age']
df_result = pd.concat([df, dfn], axis=1)
print(df_result)
# mix id name age
# 0 84726gsdid=22,name=max,age=33 22 max 33
# 1 [ieiuf8382id=21,name=kris,age=32] 21 kris 32
如果该列未修复,则使用 str.extractall
:
data = {'mix': {0: '84726gsdid=22,name=max,age=33',
1: '[ieiuf8382id=21,name=kris,age=32]',
2: 'id=23,age=20'}}
df = pd.DataFrame(data)
cols = ['id', 'name', 'age']
cols_str = "|".join(cols)
print(cols_str)
dfn = (df['mix'].str.extractall(f'({cols_str})=(\w+)')
.droplevel(1)
.set_index(0, append=True)[1]
.unstack()
.assign(mix=df['mix']))
print(dfn)
id|name|age
0 age id name mix
0 33 22 max 84726gsdid=22,name=max,age=33
1 32 21 kris [ieiuf8382id=21,name=kris,age=32]
2 20 23 NaN id=23,age=20
答案 1 :(得分:0)
您可以执行以下操作:
>>> cols = ['id', 'name', 'age']
>>> ( df.mix.str.extractall(r'=(.*?)(?:,|])')
.unstack().droplevel(0, axis=1)
.rename(columns=lambda x:cols[x]) )
match id name age
0 22 max 33
1 21 kris 32
如果您还需要 mix
列:
>>> ( df.mix.str.extractall(r'=(.*?)(?:,|])')
.unstack().droplevel(0, axis=1)
.rename(columns=lambda x:cols[x])
.assign(mix=df.mix) )
match id name age mix
0 22 max 33 [84726gsdid=22,name=max,age=33]
1 21 kris 32 [ieiuf8382id=21,name=kris,age=32]
答案 2 :(得分:0)
您可以创建字典并转换为 Series
,因此最后创建了新的 DataFrame,其列名由 =
之前的值组成,如果 id
为 id
,则创建列子串:
df = pd.DataFrame({'mix': {0: '84726gsdid=22,name=max,age=33',
1: '[ieiuf8382id=21,name=kris,age=32]'}})
print (df)
mix
0 84726gsdid=22,name=max,age=33
1 [ieiuf8382id=21,name=kris,age=32]
def f(x):
d = {}
for y in x.strip('[]').split(','):
a, b = y.split('=')
if 'id' in a:
d['id'] = b
else:
d[a] = b
return pd.Series(d)
df = df.mix.apply(f)
print (df)
id name age
0 22 max 33
1 21 kris 32
如果可能,缺少一些 =
:
def f(x):
d = {}
for y in x.strip('[]').split(','):
if '=' in y:
a, b = y.split('=')
if 'id' in a:
d['id'] = b
else:
d[a] = b
return pd.Series(d)
df = df.mix.apply(f)
print (df)
id name age
0 22 max 33
1 21 kris 32
对于原始列使用:
df1 = df.join(df.mix.apply(f))
print (df1)
mix id name age
0 84726gsdid=22,name=max,age=33 22 max 33
5 [ieiuf8382id=21,name=kris,age=32] 21 kris 32