基于在两个熊猫数据范围之间的多个条件下选择的新列



i有两个数据框,其中包含(某些)常见列(a,b,c),但订购的排序不同,并且具有不同的值。

我想用第二个数据框中的第一个数据框中的" C"值。

我可以创建这样的玩具示例:

A = [ 1, 1, 1, 2, 2, 2, 3, 3, 3 ]
B = [ 'x', 'y', 'z', 'x', 'y', 'y', 'x', 'x', 'x' ]
C = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' ]
df1 = pd.DataFrame( { 'A' : A,
                      'B' : B,
                      'C' : C } )
A.reverse()
B.reverse()
C = [ c.upper() for c in reversed(C) ]
df2 = pd.DataFrame( { 'A' : A,
                      'B' : B,
                      'C' : C } )

我想更新df1,以便看起来像这样 - 即它具有df2的" c"值:

A = [ 1, 1, 1, 2, 2, 2, 3, 3, 3 ]
B = [ 'x', 'y', 'z', 'x', 'y', 'y', 'x', 'x', 'x' ]
C = [ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I' ]

我尝试过:

df1['C'] =  df2[ (df2['A'] == df1['A']) & (df2['B'] == df1['B']) ]['C']

但这是行不通的,因为我认为A和B的顺序是不同的。

merge_df = pd.merge(df1, df2, on=['A', 'B'])
df1['C'] = merge_df['C_y']

我认为您的玩具代码在c. reverse()中的C c.upper()]中存在问题。C.反向()返回无。

这并不容易,因为在列中复制了AB3,x)。因此,我由cumcount创建新列D,然后使用 merge,最后删除不必要的列:

df1['D'] = df1.groupby(['A','B']).C.cumcount()
df2['D'] = df2.groupby(['A','B']).C.cumcount(ascending=False)
df3 = pd.merge(df1, df2, on=['A','B','D'], how='right', suffixes=('_',''))
df3 = df3.drop(['C_', 'D'], axis=1)
print (df3)
   A  B  C
0  1  x  A
1  1  y  B
2  1  z  C
3  2  x  D
4  2  y  E
5  2  y  F
6  3  x  G
7  3  x  H
8  3  x  I

最新更新