当与另一个数据框列中的列表项匹配时更新数据框中的 NaN 值
Updating NaN values in a dataframe when there's a match to a list item in another dataframe column
这里是 Python 的初学者。
试图从一堆站点中寻找解决方案。
可能只是没有正确连接点。
我正在尝试根据列表中存在的值填充 DataFrame 中的 'NaN' 值。
如果人员姓名出现在列表中,则 'geo' 列应更新为正确的地理名称。
列表是完整的,有地区的人,但 DataFrame 还没有,需要更新。
我的大致是这样的:
name geo
0 john EMEA
1 jack NaN
2 jill APAC
3 james NaN
4 judy EMEA
5 jared NaN
我想根据以下列表更新 NaN 值。
EMEA = ['john','jack','judy','jared']
APAC = ['jill','james']
首先通过每个列表创建字典:
EMEA = ['john','jack','judy','jared']
APAC = ['jill','james']
d = {'EMEA' : EMEA,
'APAC': APAC}
然后用展平交换顺序:
d1 = {x: k for k, v in d.items() for x in v}
print (d1)
{'john': 'EMEA', 'jack': 'EMEA', 'judy': 'EMEA',
'jared': 'EMEA', 'jill': 'APAC', 'james': 'APAC'}
最后只用 Series.map
and Series.fillna
映射值替换错误值:
df['geo'] = df['geo'].fillna(df['name'].map(d1))
print (df)
name geo
0 john EMEA
1 jack EMEA
2 jill APAC
3 james APAC
4 judy EMEA
5 jared EMEA
或映射所有值:
df['geo'] = df['name'].map(d1)
print (df)
name geo
0 john EMEA
1 jack EMEA
2 jill APAC
3 james APAC
4 judy EMEA
5 jared EMEA
一个简单的 np.where 应该可以解决这个问题:
https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
df['geo'] = np.where((df['geo'].isnull()) & (df['name'].isin(MEA)), 'MEA',
np.where((df['geo'].isnull()) & (df['name'].isin(APAC)), 'APAC',
pdf['geo']))
试试这个:
for x in df.index:
if df.loc[x,"name"] in EMEA:
df.loc[x,"geo"]='EMEA'
if df.loc[x,"name"] in APAC:
df.loc[x,"geo"]="APAC"
希望这对您有所帮助。祝你好运!
这里是 Python 的初学者。 试图从一堆站点中寻找解决方案。 可能只是没有正确连接点。
我正在尝试根据列表中存在的值填充 DataFrame 中的 'NaN' 值。 如果人员姓名出现在列表中,则 'geo' 列应更新为正确的地理名称。 列表是完整的,有地区的人,但 DataFrame 还没有,需要更新。
我的大致是这样的:
name geo
0 john EMEA
1 jack NaN
2 jill APAC
3 james NaN
4 judy EMEA
5 jared NaN
我想根据以下列表更新 NaN 值。
EMEA = ['john','jack','judy','jared']
APAC = ['jill','james']
首先通过每个列表创建字典:
EMEA = ['john','jack','judy','jared']
APAC = ['jill','james']
d = {'EMEA' : EMEA,
'APAC': APAC}
然后用展平交换顺序:
d1 = {x: k for k, v in d.items() for x in v}
print (d1)
{'john': 'EMEA', 'jack': 'EMEA', 'judy': 'EMEA',
'jared': 'EMEA', 'jill': 'APAC', 'james': 'APAC'}
最后只用 Series.map
and Series.fillna
映射值替换错误值:
df['geo'] = df['geo'].fillna(df['name'].map(d1))
print (df)
name geo
0 john EMEA
1 jack EMEA
2 jill APAC
3 james APAC
4 judy EMEA
5 jared EMEA
或映射所有值:
df['geo'] = df['name'].map(d1)
print (df)
name geo
0 john EMEA
1 jack EMEA
2 jill APAC
3 james APAC
4 judy EMEA
5 jared EMEA
一个简单的 np.where 应该可以解决这个问题: https://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html
df['geo'] = np.where((df['geo'].isnull()) & (df['name'].isin(MEA)), 'MEA',
np.where((df['geo'].isnull()) & (df['name'].isin(APAC)), 'APAC',
pdf['geo']))
试试这个:
for x in df.index:
if df.loc[x,"name"] in EMEA:
df.loc[x,"geo"]='EMEA'
if df.loc[x,"name"] in APAC:
df.loc[x,"geo"]="APAC"
希望这对您有所帮助。祝你好运!