2017-08-30 225 views
0

由於my previous question的延伸,我想採取類似下面的一個數據幀,並找到正確的行,從該從C列提取數據,並將其放置到基於以下標準列D根據計算值從Pandas DataFrame中的行中查找數據?

  1. B_new = 2*A_old -B_old即,新行需要有一個B等於舊行的以下結果:2*A - B
  2. 其中A是相同的,即。新行中的A應該與舊行具有相同的值。
  3. 沒有發現任何值應使用NaN結果

代碼:

import pandas as pd 
a = [2,2,2,3,3,3,3] 
b = [1,2,3,1,3,4,5] 
c = [0,1,2,3,4,5,6] 

df = pd.DataFrame({'A': a , 'B': b, 'C':c}) 
print(df) 

    A B C 
0 2 1 0 
1 2 2 1 
2 2 3 2 
3 3 1 3 
4 3 3 4 
5 3 4 5 
6 3 5 6 

所需的輸出:

A B C D 
0 2 1 0 2.0 
1 2 2 1 1.0 
2 2 3 2 0.0 
3 3 1 3 6.0 
4 3 3 4 4.0 
5 3 4 5 NaN 
6 3 5 6 3.0 

基於在my previous question的解決方案,我想出了一種使用for循環移動每個唯一值A的方法:

for i in df.A.unique(): 
    mapping = dict(df[df.A==i][['B', 'C']].values) 
    df.loc[df.A==i,'D'] = (2 * df[df.A==i]['A'] - df[df.A==i]['B']).map(mapping) 

但是,這看起來很笨重,我懷疑有一個更好的方法,不使用for循環,從我以前的經驗來看,這往往是緩慢的。

問題: 什麼是在DataFrame中完成數據傳輸的最快方法?

回答

1

你可以

In [370]: (df[['A', 'C']].assign(B=2*df.A - df.B) 
      .merge(df, how='left', on=['A', 'B']) 
      .assign(B=df.B) 
      .rename(columns={'C_x': 'C', 'C_y': 'D'})) 
Out[370]: 
    A C B D 
0 2 0 1 2.0 
1 2 1 2 1.0 
2 2 2 3 0.0 
3 3 3 1 6.0 
4 3 4 3 4.0 
5 3 5 4 NaN 
6 3 6 5 3.0 

詳情:

In [372]: df[['A', 'C']].assign(B=2*df.A - df.B) 
Out[372]: 
    A C B 
0 2 0 3 
1 2 1 2 
2 2 2 1 
3 3 3 5 
4 3 4 3 
5 3 5 2 
6 3 6 1 

In [373]: df[['A', 'C']].assign(B=2*df.A - df.B).merge(df, how='left', on=['A', 'B']) 
Out[373]: 
    A C_x B C_y 
0 2 0 3 2.0 
1 2 1 2 1.0 
2 2 2 1 0.0 
3 3 3 5 6.0 
4 3 4 3 4.0 
5 3 5 2 NaN 
6 3 6 1 3.0 
相關問題