首页 > 解决方案 > Python将一列拆分为多列并将拆分列重新附加到原始数据框中

问题描述

我想将我的数据框中的一列拆分为多列,然后将这些列附加回我的原始数据框,并根据拆分列是否包含特定字符串来划分我的原始数据框。

我有一个数据框,其中有一列的值由分号分隔,如下所示。

import pandas as pd
data = {'ID':['1','2','3','4','5','6','7'], 
    'Residence':['USA;CA;Los Angeles;Los Angeles', 'USA;MA;Suffolk;Boston', 'Canada;ON','USA;FL;Charlotte', 'NA', 'Canada;QC', 'USA;AZ'],
    'Name':['Ann','Betty','Carl','David','Emily','Frank', 'George'],
    'Gender':['F','F','M','M','F','M','M']} 
df = pd.DataFrame(data) 

然后我将列拆分如下,并根据它是否包含字符串将拆分列分成两部分USA

address = df['Residence'].str.split(';',expand=True)
country = address[0] != 'USA'
USA, nonUSA = address[~country], address[country]

现在,如果您运行USAand nonUSA,您会注意到 中有额外的列nonUSA,并且还有一行没有国家信息。所以我摆脱了这些NA价值观。

USA.columns = ['Country', 'State', 'County', 'City']
nonUSA.columns = ['Country', 'State']
nonUSA = nonUSA.dropna(axis=0, subset=[1])
nonUSA = nonUSA[nonUSA.columns[0:2]]

现在我想将USA和附加nonUSA到我的原始数据框,这样我将获得两个如下所示的数据框:

USAdata = pd.DataFrame({'ID':['1','2','4','7'], 
    'Name':['Ann','Betty','David','George'],
    'Gender':['F','F','M','M'],
    'Country':['USA','USA','USA','USA'],
    'State':['CA','MA','FL','AZ'],
    'County':['Los Angeles','Suffolk','Charlotte','None'],
    'City':['Los Angeles','Boston','None','None']})
nonUSAdata = pd.DataFrame({'ID':['3','6'], 
    'Name':['David','Frank'],
    'Gender':['M','M'],
    'Country':['Canada', 'Canada'],
    'State':['ON','QC']})

我被困在这里了。如何将我的原始数据框拆分为Residence包含USA或不包含的人,并将Residence(USAnonUSA) 中的拆分列附加回我的原始数据框?

(此外,我刚刚上传了到目前为止的所有内容,但我很好奇是否有更清洁/更智能的方法来做到这一点。)

标签: pythonpandasdataframe

解决方案


原始数据中存在唯一索引,并且在两个 DataFrames 的下一个代码中都没有更改,因此您可以使用concatfor join together 然后添加到原始数据 byDataFrame.joinconcatwith axis=1

address = df['Residence'].str.split(';',expand=True)
country = address[0] != 'USA'
USA, nonUSA = address[~country], address[country]
USA.columns = ['Country', 'State', 'County', 'City']

nonUSA = nonUSA.dropna(axis=0, subset=[1])
nonUSA = nonUSA[nonUSA.columns[0:2]]
#changed order for avoid error
nonUSA.columns = ['Country', 'State']

df = pd.concat([df, pd.concat([USA, nonUSA])], axis=1)

或者:

df = df.join(pd.concat([USA, nonUSA]))
print (df)
  ID                       Residence    Name Gender Country State  \
0  1  USA;CA;Los Angeles;Los Angeles     Ann      F     USA    CA   
1  2           USA;MA;Suffolk;Boston   Betty      F     USA    MA   
2  3                       Canada;ON    Carl      M  Canada    ON   
3  4                USA;FL;Charlotte   David      M     USA    FL   
4  5                              NA   Emily      F     NaN   NaN   
5  6                       Canada;QC   Frank      M  Canada    QC   
6  7                          USA;AZ  George      M     USA    AZ   

        County         City  
0  Los Angeles  Los Angeles  
1      Suffolk       Boston  
2          NaN          NaN  
3    Charlotte         None  
4          NaN          NaN  
5          NaN          NaN  
6         None         None  

但似乎可以简化:

c = ['Country', 'State', 'County', 'City']
df[c] = df['Residence'].str.split(';',expand=True)
print (df)
  ID                       Residence    Name Gender Country State  \
0  1  USA;CA;Los Angeles;Los Angeles     Ann      F     USA    CA   
1  2           USA;MA;Suffolk;Boston   Betty      F     USA    MA   
2  3                       Canada;ON    Carl      M  Canada    ON   
3  4                USA;FL;Charlotte   David      M     USA    FL   
4  5                              NA   Emily      F      NA  None   
5  6                       Canada;QC   Frank      M  Canada    QC   
6  7                          USA;AZ  George      M     USA    AZ   

        County         City  
0  Los Angeles  Los Angeles  
1      Suffolk       Boston  
2         None         None  
3    Charlotte         None  
4         None         None  
5         None         None  
6         None         None  

推荐阅读