使用列表中相应索引上的值映射pandas数据帧上的值

时间:2014-11-25 21:46:40

标签: python pandas numpy dataframe

我想映射此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)

1 个答案:

答案 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