python - 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]
现在,如果您运行USA
and 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
(USA
和nonUSA
) 中的拆分列附加回我的原始数据框?
(此外,我刚刚上传了到目前为止的所有内容,但我很好奇是否有更清洁/更智能的方法来做到这一点。)
解决方案
原始数据中存在唯一索引,并且在两个 DataFrames 的下一个代码中都没有更改,因此您可以使用concat
for join together 然后添加到原始数据 byDataFrame.join
或concat
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
推荐阅读
- scala - 如何将 shell 脚本中定义的变量用于 Scala 文件?
- javascript - 如何删除附加到 auth0-lock 的侦听器?
- gcc - Nix 和 GCC - `找不到 crt1.o`
- java - 序列化包含数据集的对象
- ios - iOS PDFKit 文本字段表单输入
- node.js - dialogflow fullfilment 和 firebase 响应时间
- reactjs - 使用 ReactJS 添加静态图像
- javascript - 如何在电子应用程序中使用快递
- php - wordpress 主题未安装权限被拒绝无法创建目录。在本地主机上的我的 macbook air
- angular - 同时使用 ngFor 和 ngIf 列出项目