基于两个pandas数据帧之间的多个条件选择来创建新列

时间:2017-02-15 13:15:27

标签: python pandas

我有两个包含(某些)公共列(A,B,C)的数据帧,但排序方式不同,C的值也不同。

我想将第一个数据帧中的“C”值替换为第二个数据帧中的“C”值。

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

<body>
    <nav>
        <p class="brand">potato &trade;</p>
        <ul class="nav-primary">
            <li class="nav-item"><a href="#">about</a></li>

            <li class="nav-item"><a href="#">features</a></li>

            <li class="nav-item button-cta"><a href="#">buy it now</a></li>
        </ul>
    </nav>
    <header>
        <h1 class="header-title">
            "sweet nutritious and delicious"
        </h1>

        <h3 class="header-subtitle">
            The key to happiness is hidden in the Potato &trade;
        </h3>

        <img src="img/potato-header.png" alt="Potato" class="header-potato">
    </header>
</body>
</html>

我想更新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 = 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 } )

我试过了:

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' ]

但这不起作用,因为我认为A和B的顺序不同。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

这并不容易,因为列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