Python 如何根据另一个数据帧上的列对数据帧的行进行分类?
我正在像这样构建一个数据帧Python 如何根据另一个数据帧上的列对数据帧的行进行分类?,python,pandas,dataframe,Python,Pandas,Dataframe,我正在像这样构建一个数据帧df df = pd.DataFrame({ 'South East Asia': ['India', 'Sri Lanka', 'Mali', 'Maldives'], 'Europe': ['France', 'Italy', 'Germany', 'Spain'], 'North America': ['Mexico', 'US', 'Canada', np.nan]}, columns=['South East Asia', 'E
df
df = pd.DataFrame({
'South East Asia': ['India', 'Sri Lanka', 'Mali', 'Maldives'],
'Europe': ['France', 'Italy', 'Germany', 'Spain'],
'North America': ['Mexico', 'US', 'Canada', np.nan]},
columns=['South East Asia', 'Europe', 'North America'])
看起来是这样的:
South East Asia Europe North America
0 India France Mexico
1 Sri Lanka Italy US
2 Mali Germany Canada
3 Maldives Spain NaN
我在另一个数据框df2
中有一个客户数据(~40K行),其中有一列Country
,上面列出了所有11个国家的国家
我想在df2
中创建一个新列,名为Continental,它将具有我的数据帧df
中提到的相应大陆。因此,我的期望输出
print(df2.loc[:,'Country':'containment'])
会是
Country Continent
0 France Europe
1 Italy Europe
2 Mexico North America
...
注意:在在线查询时,我发现有一些现成的工具可以将国家划分为大陆,这是可以理解的,因为社区中必须经常需要这样做。但我想学习如何根据另一个dataframes中的数据集对数据进行分类。这就是为什么我要在这11个国家和3个大洲实现同样的目标
提前谢谢 对字典使用dict理解和压扁:
s = {k:v for a, b in df.items() for k, v in dict.fromkeys(b, a).items()}
#if want remove NaNs
#s = {k:v for a, b in df.items() for k, v in dict.fromkeys(b, a).items() if pd.notnull(k)}
或使用以下内容创建系列:
最后:
使用,可以创建从国家到大陆的系列映射:
s = pd.melt(df).set_index('value')['variable']
df2['Continent'] = df2['Country'].map(s).fillna('DefaultContinent')
对于NaN
,您可能需要格外小心。例如:
mapper = pd.melt(df).dropna(subset=['value']).set_index('value')['variable']
@Vibhu-在
df2
中是否没有国家/地区
列?你需要map
列df2
嘿,你的代码行!很抱歉给你带来了困惑。非常感谢您对我前面问题的帮助。我的许多pandas
查询都是通过您在SOI上的回答来解决的。我与一位联系人进行了尝试,他的国家/地区不包括在我的数据框df
中,并将其映射到NaN
。我想知道这是怎么发生的,是否有办法设置默认映射@jezraelThank@jpp谢谢你的回答。没有dropna(子集=['value'])
,Nan
被映射到北美。但是当使用mapper
而不是s
时,NaN
会按预期被删除。此外,对于其国家/地区未在df
中列出的联系人,他们将被映射到NaN
。有没有办法设置默认映射?@Vibhu,当然,这可以通过pd.Series.fillna
实现,请参阅upate。
s = pd.melt(df).set_index('value')['variable']
df2['Continent'] = df2['Country'].map(s).fillna('DefaultContinent')
mapper = pd.melt(df).dropna(subset=['value']).set_index('value')['variable']