【问题标题】:Pandas How to merge two dataframes based on two columns and update next column?Pandas 如何基于两列合并两个数据框并更新下一列?
【发布时间】:2019-12-16 17:36:41
【问题描述】:

我想合并两个 pandas 数据框,并希望基于两列合并它们。

代码如下:

import numpy as np
import pandas as pd
from itertools import product

# first dataframe
data = np.array([[1, 1, 6],
       [1, 2, 2],
       [2, 1, 1],
       [2, 2, 9],
       [3, 1, 1],
       [3, 2, 1]])

df = pd.DataFrame(data, columns=['x','y','z'])
print(df)
   x  y  z
0  1  1  6
1  1  2  2
2  2  1  1
3  2  2  9
4  3  1  1
5  3  2  1

## another dataframe
N = 4
perms = list(product(range(N), range(N)))
x = [i[0] for i in perms]
y = [i[1] for i in perms]
df1 = pd.DataFrame({'x': x,'y': y,'z':0})

print(df1)

输出应如下所示:

    x  y  z  
0   0  0  0  
1   0  1  0  
2   0  2  0  
3   0  3  0  
4   1  0  0  
5   1  1  6  
6   1  2  2  
7   1  3  0  
8   2  0  0  
9   2  1  1 
10  2  2  9  
11  2  3  0  
12  3  0  0  
13  3  1  1  
14  3  2  1  
15  3  3  0

问题 如何从数据框 df 更新 df1 的 z 列的值?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    首先merge 然后update

    df1.update(df1.drop('z',1).merge(df,how='left'))
    df1
    Out[439]: 
        x  y    z
    0   0  0  0.0
    1   0  1  0.0
    2   0  2  0.0
    3   0  3  0.0
    4   1  0  0.0
    5   1  1  6.0
    6   1  2  2.0
    7   1  3  0.0
    8   2  0  0.0
    9   2  1  1.0
    10  2  2  9.0
    11  2  3  0.0
    12  3  0  0.0
    13  3  1  1.0
    14  3  2  1.0
    15  3  3  0.0
    

    【讨论】:

    • @MilkyWay007 是的,你可以df.set_index(['x','y']).reindex(pd.MultiIndex.from_tuples(perms),fill_value=0).reset_index()
    • 评论问题:如果我们只知道df和排列N = 4,没有中间df1,我们可以直接创建答案吗?
    • 非常感谢!这种方法有效,并且需要更多的大脑来理解算法。我会坚持我创建 df 和 df1 然后合并它们的笨方法,这样我以后更容易记住。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2017-01-20
    相关资源
    最近更新 更多