假设我有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"}]
我的想法是,我将这两个数据框合并,并尝试根据指定的列替换每列的值,但似乎没有简短的方法。
答案 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')