我有一个字典和一个数据框。字典包含一个字母到一个数字的映射,并且数据帧具有包含这些特定字母的行和包含这些特定数字的另一行,它们彼此相邻(不一定重要)。
我想通过将数据帧行中的每个字母与字典中的字母进行匹配,然后用该字母的值替换相应的数字(与字母在同一列中的数字)来更新包含数字的行从字典中。
df = pd.DataFrame(np.array([[4, 5, 6], ['a', 'b', 'c'], [7, 8, 9]]))
dict = {'a':2, 'b':3, 'c':5}
比方说,字典是字典,而df是我希望结果为df2的数据帧。
df2 = pd.DataFrame(np.array([[3, 2, 5], ['b', 'a', 'c'], [7, 8, 9]]))
df
0 1 2
0 4 5 6
1 a b c
2 7 8 9
dict
{'a': 2, 'b': 3, 'c': 5}
df2
0 1 2
0 2 3 5
1 a b c
2 7 8 9
我不知道如何使用合并或联接来解决此问题,我最初的想法是使字典成为数据框对象,但是我不确定从那里开始。
答案 0 :(得分:1)
有点奇怪,但是:
df = pd.DataFrame(np.array([[4, 5, 6], ['a', 'b', 'c'], [7, 8, 9]]))
d = {'a': 2, 'b': 3, 'c': 5}
df.iloc[0] = df.iloc[1].map(lambda x: d[x] if x in d.keys() else x)
df
# 0 1 2
# 0 2 3 5
# 1 a b c
# 2 7 8 9
我无法让自己重新定义dict
作为一本特定的字典。 :D
在收到关于apply
速度的当之无愧的打击之后,我向您介绍以下理论上更快的方法:
df.iloc[0] = df.iloc[1].map(d).where(df.iloc[1].isin(d.keys()), df.iloc[0])
如果第1行中的值位于d(df.iloc[1].map(d)
)的键中,则将为您提供d(.where(df.iloc[1].isin(d.keys()), ...
)的字典值,否则,您将获得第0行中的值({{1 }}。
希望这会有所帮助!
答案 1 :(得分:0)
如果需要将该方法翻转为列,则Mike的答案只需进行简单的调整即可。
df.iloc[:,0] = df.iloc[:,1].map(d).where(df.iloc[:,1].isin(d.keys()), df.iloc[:,0])
其中0和1可以更改为您要与字典匹配的列。