Pandas:使用另一个数据帧中的值分配值

时间:2017-10-24 06:11:18

标签: python pandas

假设我有df1:

       'A'    'B'  'C'
Day0    1      4     3
Day1    2      7     6
Day2    5      1    10

和df2:

        col1      col2      
Day0      1        Nan       
Day1      7         6       
Day2     10         5      

如何使用df2中的值替换df1中的值以获得如下输出:

var obj = [{name: "ana", gender: "woman"}, {name: "ben", gender: "man"}, 
           {name: "andrew", gender: "man"}, {name: "jake", gender: "man"}]

我的想法是,我将这两个数据框合并,并尝试根据指定的列替换每列的值,但似乎没有简短的方法。

3 个答案:

答案 0 :(得分:2)

嵌套dictionaries使用replace,但它只适用于列,因此需要双转置:

d = df2.to_dict(orient='index')
print (d)
{'Day2': {"'C'": 10, "'A'": 5, "'B'": 1}, 
'Day1': {"'C'": 6, "'A'": 2, "'B'": 7}, 
'Day0': {"'C'": 3, "'A'": 1, "'B'": 4}}

df = df1.T.replace(d).T
print (df)
      col1  col2
Day0   1.0   NaN
Day1   7.0   6.0
Day2  10.0   5.0

答案 1 :(得分:1)

与@ juanpa.arrivillaga

一致

lookup版本1

df1.stack().pipe(
    lambda x: pd.Series(
        df2.lookup(x.index.get_level_values(0), x.values),
        x.index
    )).unstack()

      col1  col2
Day0   1.0   NaN
Day1   7.0   6.0
Day2  10.0   5.0

lookup第2版

df1.apply(
    lambda y: (
        lambda x: pd.Series(
            df2.lookup(x.index, x.values), x.index
        ))(y.dropna()))

      col1  col2
Day0     1   NaN
Day1     7   6.0
Day2    10   5.0

理解

pd.DataFrame({
    c: {
        r: df2.stack().get((r, v), None)
        for r, v in df1[c].items()
    } for c in df1
})

      col1  col2
Day0     1   NaN
Day1     7   6.0
Day2    10   5.0

答案 2 :(得分:0)

所以我尝试了这个并且它有点工作而且非常快,不确定你们的想法。

result = df1.copy()
result[result.notnull()] = 0
for name in df2.columns:
    result += (df1 == name).astype(int).multiply(df2[name], axis='index')