通过拆分每一列并迭代 python pandas DataFrame 中的许多列来插入新列
inserting new columns by splitting each column and iterating for many columns in python pandas DataFrame
这里有一个示例数据框:
dfx = pd.DataFrame({
'name': ['alex','bob','jack'],
'age': ["0,26,4","1,25,4","5,30,2"],
'job': ["x,abc,0","y,xyz,1","z,pqr,2"],
'gender': ["0,1","0,1","0,1"]
})
我想先拆分列 dfx['age'] 并为其插入 3 个单独的列,一个用于年龄值中的每个子字符串,将它们命名为 dfx['age1'],dfx['age2'],dfx['age3']。我为此使用了以下代码:
dfx = dfx.assign(**{'age1':(dfx['age'].str.split(',', expand = True)[0]),\
'age2':(dfx['age'].str.split(',', expand = True)[1]),\
'age3':(dfx['age'].str.split(',', expand = True)[2])})
dfx = dfx[['name', 'age','age1', 'age2', 'age3', 'job', 'gender']]
dfx
目前一切顺利!
现在,我想对其他列 job 和 gender.
重复相同的操作
期望输出
name age age1 age2 age3 job job1 job2 job3 gender gender1 gender2
0 alex 0,26,4 0 26 4 x,abc,0 x abc 0 0,1 0 1
1 bob 1,25,4 1 25 4 y,xyz,1 y xyz 1 0,1 0 1
2 jack 5,30,2 5 30 2 z,pqr,2 z pqr 2 0,1 0 1
对于像这样的小数据框,我可以单独执行它。但是,实际的数据文件有很多这样的列。我需要 迭代 .
我发现在迭代列和命名各个列方面存在困难。
如果有更好的解决方案,我会很高兴。
谢谢!
使用列表推导来拆分列表中定义的 DataFrames 列表的列,添加过滤列并通过 concat
with sorting columns names, then prepend not matched columns by DataFrame.join
:
连接在一起
cols = ['age','job','gender']
L = [dfx[x].str.split(',',expand=True).rename(columns=lambda y: f'{x}{y+1}') for x in cols]
df1 = dfx[dfx.columns.difference(cols)]
df = df1.join(pd.concat([dfx[cols]] + L, axis=1).sort_index(axis=1))
print (df)
name age age1 age2 age3 gender gender1 gender2 job job1 job2 job3
0 alex 0,26,4 0 26 4 0,1 0 1 x,abc,0 x abc 0
1 bob 1,25,4 1 25 4 0,1 0 1 y,xyz,1 y xyz 1
2 jack 5,30,2 5 30 2 0,1 0 1 z,pqr,2 z pqr 2
再次感谢@jezrael 的回答。受到使用 'f-string' 的启发,我使用迭代解决了如下问题:
for col in dfx.columns[1:]:
for i in range(len(dfx[col][0].split(','))):
dfx[f'{col}{i+1}'] = (dfx[col].str.split(',', expand = True)[i])
dfx = dfx[['name', 'age','age1', 'age2', 'age3', 'job','job1', 'job2','job3', 'gender'
, 'gender1', 'gender2']]
dfx
这里有一个示例数据框:
dfx = pd.DataFrame({
'name': ['alex','bob','jack'],
'age': ["0,26,4","1,25,4","5,30,2"],
'job': ["x,abc,0","y,xyz,1","z,pqr,2"],
'gender': ["0,1","0,1","0,1"]
})
我想先拆分列 dfx['age'] 并为其插入 3 个单独的列,一个用于年龄值中的每个子字符串,将它们命名为 dfx['age1'],dfx['age2'],dfx['age3']。我为此使用了以下代码:
dfx = dfx.assign(**{'age1':(dfx['age'].str.split(',', expand = True)[0]),\
'age2':(dfx['age'].str.split(',', expand = True)[1]),\
'age3':(dfx['age'].str.split(',', expand = True)[2])})
dfx = dfx[['name', 'age','age1', 'age2', 'age3', 'job', 'gender']]
dfx
目前一切顺利!
现在,我想对其他列 job 和 gender.
重复相同的操作期望输出
name age age1 age2 age3 job job1 job2 job3 gender gender1 gender2
0 alex 0,26,4 0 26 4 x,abc,0 x abc 0 0,1 0 1
1 bob 1,25,4 1 25 4 y,xyz,1 y xyz 1 0,1 0 1
2 jack 5,30,2 5 30 2 z,pqr,2 z pqr 2 0,1 0 1
对于像这样的小数据框,我可以单独执行它。但是,实际的数据文件有很多这样的列。我需要 迭代 .
我发现在迭代列和命名各个列方面存在困难。
如果有更好的解决方案,我会很高兴。
谢谢!
使用列表推导来拆分列表中定义的 DataFrames 列表的列,添加过滤列并通过 concat
with sorting columns names, then prepend not matched columns by DataFrame.join
:
cols = ['age','job','gender']
L = [dfx[x].str.split(',',expand=True).rename(columns=lambda y: f'{x}{y+1}') for x in cols]
df1 = dfx[dfx.columns.difference(cols)]
df = df1.join(pd.concat([dfx[cols]] + L, axis=1).sort_index(axis=1))
print (df)
name age age1 age2 age3 gender gender1 gender2 job job1 job2 job3
0 alex 0,26,4 0 26 4 0,1 0 1 x,abc,0 x abc 0
1 bob 1,25,4 1 25 4 0,1 0 1 y,xyz,1 y xyz 1
2 jack 5,30,2 5 30 2 0,1 0 1 z,pqr,2 z pqr 2
再次感谢@jezrael 的回答。受到使用 'f-string' 的启发,我使用迭代解决了如下问题:
for col in dfx.columns[1:]:
for i in range(len(dfx[col][0].split(','))):
dfx[f'{col}{i+1}'] = (dfx[col].str.split(',', expand = True)[i])
dfx = dfx[['name', 'age','age1', 'age2', 'age3', 'job','job1', 'job2','job3', 'gender'
, 'gender1', 'gender2']]
dfx