2017-05-16 100 views
0

我已經搜索了這個問題的答案,但我甚至不知道如何用近似結果來描述它。熊貓根據另一個數據幀返回一個數據幀的列數

現狀:

我想帶來的價值列DF並將它們合併到DF2,但我需要上取決於它多列合併返回一個值與否。現在的過程是根據是否返回值來查看是否按照HIGH,MID,LOW列的順序連接返回值。如果某些HIGH值沒有返回結果,那麼只能加入MID列,那麼如果仍然沒有匹配,則您將使用LOW列執行相同的過程。我正在研究groupby方法,但不知道這是否是實現我的目標的最佳方式。

這是一個基本的例子:

df = pd.DataFrame({ 'LOW' : ['Abc', 'Bcd', 'CdE'], 'MID' : ['aBc', 'bCd', 'cDe'], 'HIGH': ['abC', 'bcD', 'cdE'], 'VALUE1': ['1','2','3'], 'VALUE2': ['bb','dd','ee']}) 

df 

+----+-------+------+------+---------+--------+ 
| | HIGH | LOW | MID | VALUE1 | VALUE2 | 
+----+-------+------+------+---------+--------+ 
| 0 | abC | Abc | aBc |  1 | bb  | 
| 1 | bcD | Bcd | bCd |  2 | dd  | 
| 2 | cdE | CdE | cDe |  3 | ee  | 
+----+-------+------+------+---------+--------+ 

df2 = pd.DataFrame({ 'LOW' : ['Abc-4', 'Bcd-1', 'CdE'], 'MID' : ['aBc*2', 'bCd', 'cDe&3'], 'HIGH': ['abC', 'bcD$22', 'cdE#2']}) 

df2 

+----+---------+--------+-------+ 
| | HIGH | LOW | MID | 
+----+---------+--------+-------+ 
| 0 | abC  | Abc-4 | aBc*2 | 
| 1 | bcD$22 | Bcd-1 | bCd | 
| 2 | cdE#2 | CdE | cDe&3 | 
+----+---------+--------+-------+ 

df_result 

+----+---------+--------+--------+--------+--------+ 
| | HIGH | LOW | MID | VALUE | VALUE2 | 
+----+---------+--------+--------+--------+--------+ 
| 0 | abC  | Abc-4 | aBc*2 |  1 | bb  | 
| 1 | bcD$22 | Bcd-1 | bCd |  2 | dd  | 
| 2 | cdE#2 | CdE | cDe&3 |  3 | ee  | 
+----+---------+--------+--------+--------+--------+ 

謝謝!

+0

我認爲唯一的辦法就是在這裏先合併上'HIGH',檢查'nan',如果'nan's存在然後合併下一個等等。 – muon

+0

我結束了這個建議。下面的答案完全適用於我的簡單示例,但它不適合我的實際使用情況。 –

回答

1

一個更好的例子會有所幫助,但如果我是正確的下面,下面的工作:

df3 = pd.merge(df2, df, on='HIGH', how='inner', suffixes=['', 'r']) 
df4 = pd.merge(df2, df, on='MID', how='inner', suffixes=['', 'r']) 
df5 = pd.merge(df2, df, on='LOW', how='inner', suffixes=['', 'r']) 
df6 = pd.concat([df3, df4, df5]).drop(['HIGHr', 'MIDr', 'LOWr'], axis=1) 

df6 

    HIGH LOW  MID  VALUE1 VALUE2 
0 abC  Abc-4 aBc*2 1  bb 
1 bcD$22 Bcd-1 bCd  2  dd 
2 cdE#2 CdE  cDe&3 3  ee 
0

這是你想要的嗎?

import numpy 
import pandas as pd 
df = pd.DataFrame({ 'LOW' : ['Abc', 'Bcd', 'CdE'], 'MID' : ['aBc', 'bCd', 'cDe'], 'HIGH': ['abC', 'bcD', 'cdE'], 'VALUE1': ['1','2','3'], 'VALUE2': ['bb','dd','ee']}) 
df1=df.drop(['VALUE1','VALUE2'],axis=1) 

df2 = pd.DataFrame({ 'LOW' : ['Abc-4', 'Bcd-1', 'CdE'], 'MID' : ['aBc*2', 'bCd23', 'cDe&3'], 'HIGH': ['abC', 'bcD$22', 'cdE#2']}) 

rowsum=numpy.sum((df1==df2).astype(int),axis=1) 
df_result=df2 
df_result['VALUE1']=df.VALUE1*rowsum 
df_result['VALUE2']=df.VALUE2*rowsum 
df_result 

Out[4]: 
    HIGH LOW MID VALUE1 VALUE2 
0  abC Abc-4 aBc*2  1  bb 
1 bcD$22 Bcd-1 bCd23    
2 cdE#2 CdE cDe&3  3  ee