我想映射此DataFrame:
one three two
A 4 1 2
B 1 2 1
C 2 NaN 2
D 3 3 3
到另一个,以便从使用旧值作为索引的列表中获取新值中的值:[2.0, 3.6666666666666665, 5.333333333333333, 7.0]
。我需要一个优雅的解决方案,丑陋的解决方案是使用for循环来做这个元素。
以下是入门代码:
import pandas as pd
d = {'three': {'A': 1.0, 'C': nan, 'B': 2.0, 'D': 3.0}, 'two': {'A': 2.0, 'C': 2.0, 'B': 1.0, 'D': 3.0}, 'one': {'A': 4.0, 'C': 2.0, 'B': 1.0, 'D': 3.0}}
l = [2.0, 3.6666666666666665, 5.333333333333333, 7.0]
df = pd.DataFrame(d)
我在尝试的是:
conv = lambda x: l[int(x)-1] if x<>'NaN' else 'NaN'
df2 = df.applymap(conv)
不幸的是x是整个专栏。使用applymap()或apply()时是否可以获取当前行索引?
第二种可能性是在df.values中完成,并且可能在numpy中使用一些函数式编程来广播值..如引用here但我不是一个很棒的numpy maestro。
现在我这样做了,它有效,但它很丑陋地说:
d = df.to_dict()
d2 = {}
for c in d:
t = {}
for r in d[c]:
v = d[c][r]
try:
t[r] = l[int(v)-1]
except:
t[r]=None
d2[c] = t
df = pd.DataFrame(d2)
答案 0 :(得分:1)
您可以使用DataFrame的replace()
方法执行此操作。
只需传入两个列表:要查找的值和交换它们的值:
>>> find = [1, 2, 3, 4]
>>> repl = [2.0, 3.6666666666666665, 5.333333333333333, 7.0]
>>> df.replace(find, repl)
one three two
A 7.000000 2.000000 3.666667
B 2.000000 3.666667 2.000000
C 3.666667 NaN 3.666667
D 5.333333 5.333333 5.333333