我有一个数据框,其中包含如下映射信息:
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
任何想法,提示,信息,链接都会有所帮助。
答案 0 :(得分:1)
如果BI
列中只有NI
和G
值,则按条件与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