我正在构建一个像这样的数据框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个国家/地区的国家/地区。
我想在名为Continent的df2
中创建一个新列,该列将具有我的数据框df
中提到的相应大陆。 <_ p>我想要的输出
print(df2.loc[:, 'Country':'Continent'])
将是
Country Continent
0 France Europe
1 Italy Europe
2 Mexico North America
...
注意:在线查询此查询时,我发现有一些现成的工具可以将国家/地区分类到各大洲,这是可以理解的,因为这必须经常在社区内进行。但我想学习如何根据其他数据框中的数据集对数据进行分类。这就是为什么我只想在这11个国家和3大洲实现同样的目标。
提前致谢!
答案 0 :(得分: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)}
或使用stack
创建Series
:
s = df.stack().reset_index().set_index(0)['level_1']
print (s)
India South East Asia
France Europe
Mexico North America
Sri Lanka South East Asia
Italy Europe
US North America
Mali South East Asia
Germany Europe
Canada North America
Maldives South East Asia
Spain Europe
Name: level_1, dtype: object
和上一次map
:
df2['Continent'] = df2['Country'].map(s)
答案 1 :(得分:1)
使用pandas.melt
,您可以创建一个到大陆的系列映射国家/地区:
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']