我有如下数据:
currency country
GBP GB
USD NaN
USD US
AUD AUD
GBP NaN
基本上,我正在尝试在“国家/地区”列中有条件地替换NaN
,使其值取决于该行中的货币是什么。 (例如,对于GBP
,它应该是GB
)。
我有一个单独的字典,将货币映射到国家。但是我不确定如何替换“国家/地区”列中的值
答案 0 :(得分:2)
假设您有字典d
,则可以使用set_index
,fillna
和reset_index
d = {'GBP': 'GB', 'USD': 'US', 'AUD': 'AUD'}
df = df.set_index('currency').country.fillna(d).reset_index()
Out[39]:
currency country
0 GBP GB
1 USD US
2 USD US
3 AUD AUD
4 GBP GB
答案 1 :(得分:1)
将{{1}的Series.fillna
与Series.map
一起使用,如果dict
中有更多列,则解决方案也可以使用:
DataFrame
编辑:
如果#one possible solution is generate dictionary from existing values
d = df.dropna().set_index('currency')['country'].to_dict()
#or use dictionary
#d = {'GBP': 'GB', 'USD': 'US', 'AUD': 'AUD'}
df['country'] = df['country'].fillna(df['currency'].map(d))
print (df)
currency country
0 GBP GB
1 USD US
2 USD US
3 AUD AUD
4 GBP GB
的所有值都在字典中,则应简化解决方案:
currency
如果没有,那么如果仅使用d = {'GBP': 'GB', 'USD': 'US', 'AUD': 'AUD'}
df['country'] = df['currency'].map(d)
print (df)
currency country
0 GBP GB
1 USD US
2 USD US
3 AUD AUD
4 GBP GB
,它将仅替换匹配的值:
map
因此,如果需要不在dict中的原始值(此处为GBP1)没有替换为print (df)
currency country
0 GBP1 GB1
1 USD NaN
2 USD US
3 AUD AUD
4 GBP NaN
d = {'GBP': 'GB', 'USD': 'US', 'AUD': 'AUD'}
df['country'] = df['currency'].map(d)
print (df)
currency country
0 GBP1 NaN
1 USD US
2 USD US
3 AUD AUD
4 GBP GB
,请使用第一种解决方案:
NaN