簡體   English   中英

通過拆分每列並迭代 python pandas DataFrame 中的許多列來插入新列

[英]inserting new columns by splitting each column and iterating for many columns in python pandas DataFrame

這里我有一個例子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 個單獨的列,每個 substring 的年齡值各一個,將它們命名為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   

到目前為止,一切都很好!

現在,我想對其他列jobgender重復相同的操作。

所需 Output

   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與排序列名稱連接在一起,然后通過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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM