如何在没有公共索引的情况下将Pandas数据框用作地图

时间:2018-09-17 10:16:43

标签: pandas

我有一个数据框,其中包含如下映射信息:

dfMap = pd.DataFrame({'BId': ['Banana', 'Apple', 'Guava', np.nan, np.nan],
                      'NId': [np.nan, 'GOne',  np.nan, 'GFive','GTwo'],
                      'Id': ['Banana', 'Apple', 'Guava', 'GFive', 'GTwo']})
print(dfMap)

      BId    NId      Id
0  Banana    NaN  Banana
1   Apple   GOne   Apple
2   Guava    NaN   Guava
3     NaN  GFive   GFive
4     NaN   GTwo    GTwo

我有一个输入数据框,如下所示:

df = pd.DataFrame({'S': ['Banana', 'GTwo', 'Apple', 'GOne', 'Guava', 'GFive'],
                   'G': ['BI', 'NI', 'BI', 'NI', 'BI', 'NI']})
print(df)

        S   G
0  Banana  BI
1    GTwo  NI
2   Apple  BI
3    GOne  NI
4   Guava  BI
5   GFive  NI

现在,我想添加新列df ['Id'],它是dfMap的映射值,因此输出数据帧应如下所示:

        S   G      Id
0  Banana  BI  Banana
1    GTwo  NI    GTwo
2   Apple  BI   Apple
3    GOne  NI   Apple
4   Guava  BI   Guava
5   GFive  NI   GFive

我尝试通过np.where使用以下代码,但这给了我错误:

mask = df[df['G'] == 'BI']
df['Id'] = np.where(mask, dfMap.loc[df['S'] == dfMap['BId'], 'Id'], dfMap.loc[df['S'] == dfMap['NId'], 'Id'])

ValueError: Can only compare identically-labeled Series objects

任何想法,提示,信息,链接都会有所帮助。

1 个答案:

答案 0 :(得分:1)

如果BI列中只有NIG值,则按条件与Series.map一起使用numpy.where

a = dfMap.set_index('BId')['Id']
b = dfMap.set_index('NId')['Id']

mask = df['G'] == 'BI'
df['Id'] = np.where(mask, df['S'].map(a), df['S'].map(b))
print (df)
        S   G      Id
0  Banana  BI  Banana
1    GTwo  NI    GTwo
2   Apple  BI   Apple
3    GOne  NI   Apple