繁体   English   中英

Python 将一列拆分为多列并将拆分列重新附加到原始 dataframe

[英]Python split one column into multiple columns and reattach the split columns into original dataframe

我想将我的 dataframe 中的一列拆分为多列,然后将这些列附加到我原来的 dataframe 并根据拆分列是否包含特定的拆分我的原始 dataframe。

我有一个 dataframe 有一列,其值用分号分隔,如下所示。

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]

现在,如果您运行USAnonUSA ,您会注意到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]]

现在我想将USAnonUSA附加到我原来的 dataframe,这样我就会得到两个如下所示的数据帧:

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']})

我被困在这里了。 如何将我原来的 dataframe 拆分为Residence是否包括USA的人,并将ResidenceUSA和非美国)的拆分列附加回我原来的nonUSA

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

原始数据中存在唯一索引,并且在两个 DataFrame 的下一个代码中都没有更改,因此您可以使用concat连接在一起,然后通过DataFrame.joinconcat with 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  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM