如何根据另一个数据帧上的列对数据帧的行进行分类?

时间:2018-06-14 08:18:43

标签: 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', '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大洲实现同样的目标。

提前致谢!

2 个答案:

答案 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']