2017-10-28 64 views
1

我有一個數據幀的樣子 DF1上的數據幀附加一個新列基於其他數據幀與匹配的行,並從現有柱

UserID group day  sp PU 
213  test 12/11/14 3 311 
314 control 13/11/14 4 345 
354  test 13/08/14 5 376 

和第二數據幀填補值不匹配的那些DF2,它擁有大約在DF1列用戶ID值的信息,在DF2匹配的行和DF1是測試紅等人應該是自己。 DF2

UserID 
213 

什麼我的目標是要追加一個新列group2df1使用來自df2以及如下值已經存在於df1匹配值在DF1組列衍生,.比如這裏的userid 213在DF1和DF2和匹配,所以應該在新追加的列「組2」的測試,紅色被添加,否則它應該,因爲它是從group列。 DF1

UserID group day  sp PU group2 
    213  test 12/11/14 3 311 test-Red 
    314 control 13/11/14 4 345 control 
    354  test 13/08/14 5 376 test-NonRed 

這是我試過,

def converters(df2,df1): 
    if df1['UserId']==df2['UserId']: 
      val="test-Red" 
    elif df1['group']== "test": 
     val="test-NonRed"  
    else: 
      val="control" 

    return val 

但它拋出錯誤。如下圖所示

ValueError: Series lengths must match to compare 
+1

其中所述'group2'來自? – Wen

+1

您肯定沒有提供足夠的信息 – piRSquared

+0

group2是我需要添加到df1的新列,這是我的瞄準結果 – user1017373

回答

3

使用numpy.where

df1['new'] = np.where(df1['UserID'].isin(df2['UserID']), 'test-Red', 
      np.where(df1['group'] == 'test','test-NonRed',df1['group'])) 
print (df1) 
    UserID group  day sp PU   new 
0  213  test 12/11/14 3 311  test-Red 
1  314 control 13/11/14 4 345  control 
2  354  test 13/08/14 5 376 test-NonRed 

numpy.select

m1 = df1['UserID'].isin(df2['UserID']) 
m2 = df1['group'] == 'test' 
df1['new'] = np.select([m1,m2], ['test-Red', 'test-NonRed'],default=df1['group']) 
print (df1) 
    UserID group  day sp PU   new 
0  213  test 12/11/14 3 311  test-Red 
1  314 control 13/11/14 4 345  control 
2  354  test 13/08/14 5 376 test-NonRed 

更通用的解決方案:

print (df1) 
    UserID  group  day sp PU 
0  213  test 12/11/14 3 311 
1  314 control 13/11/14 4 345 
2  354  test 13/08/14 5 376 
3 2131  test1 12/11/14 3 311 
4  314 control1 13/11/14 4 345 
5  354  test1 13/08/14 5 376 

df2 = pd.DataFrame({'UserID':[213, 2131]}) 


m1 = df1['UserID'].isin(df2['UserID']) 
m2 = df1['group'].isin(df1.loc[m1, 'group']) 

df1['new'] = np.select([m1,m2], 
         [df1['group'] + '-Red', df1['group'] + '-NonRed'], 
         default=df1['group']) 
print (df1) 
    UserID  group  day sp PU   new 
0  213  test 12/11/14 3 311  test-Red 
1  314 control 13/11/14 4 345  control 
2  354  test 13/08/14 5 376 test-NonRed 
3 2131  test1 12/11/14 3 311  test1-Red 
4  314 control1 13/11/14 4 345  control1 
5  354  test1 13/08/14 5 376 test1-NonRed 
+0

I喜歡雙np.where。先生,很好用。 NP。也選擇。 – Dark

+1

是的,但要選擇好,如果有更多的條件 - 更易讀;) – jezrael

+1

我還沒有使用'.select'得多。將來會更多地使用它們。使用 – Dark

-1

你可以使用pd.merge,並指定如何=外部參數?這將包括所有從兩個表中的數據被連接

即:

df1.merge(DF2,如何=外,上用戶ID =)

相關問題