2016-11-29 108 views
0

一个数据帧的更新列我有一个问题,我找到了一个解决办法,但我觉得这是错误的方式来做到这一点。也许,有一个更“规范”的方式来做到这一点。熊猫(蟒蛇) - 从另一个与条件和不同的列

我已经had an answer for a really similar problem,但在这里我没有在每个数据帧行的量相同。对不起,“双后”,但第一个仍然有效,所以我认为最好是做一个新的。

问题

我有两个数据框,我想,而无需额外的列,但不删除现有的相关信息进行合并。例如:

现有数据帧(DF)

A A2 B 
0 1 4 0 
1 2 5 1 
2 2 5 1 

数据帧合并(DF2)

A A2 B 
0 1 4 2 
1 3 5 2 

我想与df2更新df如果列 'A' 和 'A2' 对应。 其结果将是:

A A2 B 
0 1 4 2 <= Update value ONLY 
1 2 5 1 
2 2 5 1 

这里是我的解决方案,但我认为这不是一个非常好的一个。

import pandas as pd 

df = pd.DataFrame([[1,4,0],[2,5,1],[2,5,1]],columns=['A','A2','B']) 

df2 = pd.DataFrame([[1,4,2],[3,5,2]],columns=['A','A2','B']) 

df = df.merge(df2,on=['A', 'A2'],how='left') 
df['B_y'].fillna(0, inplace=True) 
df['B'] = df['B_x']+df['B_y'] 
df = df.drop(['B_x','B_y'], axis=1) 
print(df) 

我试过这个解决方案:

rows = (df[['A','A2']] == df2[['A','A2']]).all(axis=1) 
df.loc[rows,'B'] = df2.loc[rows,'B'] 

但我因为错误的行数的这个错误:

ValueError: Can only compare identically-labeled DataFrame objects 

有没有人有一个更好的办法呢? 谢谢!

回答

1

我认为你可以使用DataFrame.isin进行检查,其中在两种DataFrames同一行。然后通过mask创建NaN,其由combine_first填充。最后投给int

mask = df[['A', 'A2']].isin(df2[['A', 'A2']]).all(1) 
print (mask) 
0  True 
1 False 
2 False 
dtype: bool 

df.B = df.B.mask(mask).combine_first(df2.B).astype(int) 
print (df) 
    A A2 B 
0 1 4 2 
1 2 5 1 
2 2 5 1 
+0

谢谢!不是那么容易,但我会分析/学习/使用这个:D – Lerenn

1

随着在布尔面具被创建的方式细微调整,就可以得到它的工作:

cols = ['A', 'A2'] 
# Slice it to match the shape of the other dataframe to compare elementwise 
rows = (df[cols].values[:df2.shape[0]] == df2[cols].values).all(1) 
df.loc[rows,'B'] = df2.loc[rows,'B'] 
df 

enter image description here