我有一个数据框:
values
NaN
NaN
[1,2,5]
[2]
[5]
还有字典
{nan: nan,
'1': '10',
'2': '11',
'5': '12',}
数据框包含字典中的键。
如何用同一词典中的相应值替换这些键?
输出:
values
NaN
NaN
[10,11,12]
[11]
[12]
我尝试过
so_df['values'].replace(my_dictionary, inplace=True)
so_df.head()
答案 0 :(得分:3)
您可以使用pandas df的apply()
方法。检查以下实现:
import pandas as pd
import numpy as np
df = pd.DataFrame([np.nan,
np.nan,
['1', '2', '5'],
['2'],
['5']], columns=['values'])
my_dict = {np.nan: np.nan,
'1': '10',
'2': '11',
'5': '12'}
def update(row):
if isinstance(row['values'], list):
row['values'] = [my_dict.get(val) for val in row['values']]
else:
row['values'] = my_dict.get(row['values'])
return row
df = df.apply(lambda row: update(row), axis=1)
简单的实现。只要确保您的数据框包含字符串,字典关键字也包含字符串即可。
答案 1 :(得分:1)
import numpy as np
df=pd.DataFrame({'values':[np.nan,np.nan,[1,2,5],[2],5]})
my_dict={np.nan: np.nan, '1': '10', '2': '11', '5': '12'}
将Series.explode
与Series.map
一起使用
df['values']=( df['values'].explode()
.astype(str)
.map(my_dict)
.dropna()
.astype(int)
.groupby(level = 0)
.agg(list) )
如果您的值列中还有其他字符串,则您需要将pd.to_numeric
与errors = coerce
配合使用,以保持此字符串,您应该这样做:
df['values']=(pd.to_numeric( df['values'].explode()
.astype(str)
.replace(my_dict),
errors = 'coerce')
.dropna()
.groupby(level = 0)
.agg(list)
.fillna(df['values'])
)
输出
values
0 NaN
1 NaN
2 [10, 11, 12]
3 [11]
4 [12]
更新
没有explode
df['values']=(pd.to_numeric( df['values'].apply(pd.Series)
.stack()
.reset_index(level=1,drop=1)
.astype(str)
.replace(my_dict),
errors = 'coerce')
.dropna()
.groupby(level = 0)
.agg(list)
.fillna(df['values'])
)
答案 2 :(得分:1)
尝试:
df['values']=pd.to_numeric(df['values'].explode().astype(str).map(my_dict), errors='coerce').groupby(level=0).agg(list)