2017-10-24 10 views
3

は私がDF1があるとします。パンダ:別のデータフレームからの値を使用して割り当てた値

 col1  col2  
Day0  'A'  NaN  
Day1  'B'  'C'  
Day2  'C'  'A' 

とDF2:

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

は、どのように私はこのような出力を得るために、DF2の値を使用して、DF1の値を置き換えることができます:私は私の心を持っていることは、私はこれらの二つのデータフレームをCBINDとEAの値を置き換えようということである

 col1  col2  
Day0  1  Nan  
Day1  7   6  
Day2  10   5  

CH列を指定した列に基づいていますが、短時間で行うことはできませんでした。

ネストされた dictionariesによって

答えて

2

使用replace、それが唯一の列での作業なので、二重の転置が必要です:@のjuanpa.arrivillagaの線に沿って

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

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 
0

は、だから私はこれを試してみましたが、それはちょっと仕事と、それはあなたたちが何を考えてわからない、非常に高速です。

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

実際のデータのサイズはどれですか?テストソリューションの使用タイミングが最適です。 – jezrael

関連する問題