2017-07-14 95 views
0

我有这样如何替换在大熊猫数据帧的一部分

df1= 

A B C 
a 1 2 
b 3 4 
b 5 6 
c 7 8 
d 9 10 

样本数据帧我想更换此数据帧的一部分(COL A = a和b)与该数据帧

df2= 

A B C 
b 9 10 
b 11 12 
c 13 14 

我想获得结果下

df3= 

A B C 
a 1 2 
b 9 10 
b 11 12 
c 13 14 
d 9 10 

我试图

df1[df1.A.isin("bc")]... 

但我无法弄清楚如何更换。 有人告诉如何替换数据帧。

+0

'assign'或'update' – Wen

回答

1

您需要通过Acombine_firstupdate,但由于重复需要cumcount

df1['g'] = df1.groupby('A').cumcount() 
df2['g'] = df2.groupby('A').cumcount() 
df1 = df1.set_index(['A','g']) 
df2 = df2.set_index(['A','g']) 

df3 = df2.combine_first(df1).reset_index(level=1, drop=True).astype(int).reset_index() 
print (df3) 
    A B C 
0 a 1 2 
1 b 9 10 
2 b 11 12 
3 c 13 14 
4 d 9 10 

另一种解决方案:

df1['g'] = df1.groupby('A').cumcount() 
df2['g'] = df2.groupby('A').cumcount() 
df1 = df1.set_index(['A','g']) 
df2 = df2.set_index(['A','g']) 

df1.update(df2) 
df1 = df1.reset_index(level=1, drop=True).astype(int).reset_index() 
print (df1) 
    A B C 
0 a 1 2 
1 b 9 10 
2 b 11 12 
3 c 13 14 
4 d 9 10 

如果df1 duplicatesof列Adf2是相同的,有相同的长度:

df2.index = df1.index[df1.A.isin(df2.A)] 
df3 = df2.combine_first(df1) 
print (df3) 
    A  B  C 
0 a 1.0 2.0 
1 b 9.0 10.0 
2 b 11.0 12.0 
3 c 13.0 14.0 
4 d 9.0 10.0 
0

正如我所解释的,尝试update

import pandas as pd 


df1 = pd.DataFrame({"A":['a','b','b','c'], "B":[1,2,4,6], "C":[3,2,1,0]}) 

df2 = pd.DataFrame({"A":['b','b','c'], "B":[100,400,300], "C":[39,29,100]}).set_index(df1.loc[df1.A.isin(df2.A),:].index) 

df1.update(df2) 

Out[75]: 
    A  B  C 
0 a 1.0 3.0 
1 b 100.0 39.0 
2 b 400.0 29.0 
3 c 300.0 100.0 
0

,你可以用下面的解决你的问题:

import pandas as pd 

df1 = pd.DataFrame({'A':['a','b','b','c','d'],'B':[1,3,5,7,9],'C':[2,4,6,8,10]}) 

df2 = pd.DataFrame({'A':['b','b','c'],'B':[9,11,13],'C':[10,12,14]}).set_index(df1.loc[df1.A.isin(df2.A),:].index) 

df1.loc[df1.A.isin(df2.A), ['B', 'C']] = df2[['B', 'C']] 

Out[108]: 
    A B C 
0 a 1 2 
1 b 9 10 
2 b 11 12 
3 c 13 14 
4 d 9 10