首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换来自另一个数据帧的列的值

替换来自另一个数据帧的列的值
EN

Stack Overflow用户
提问于 2019-12-20 13:36:03
回答 2查看 118关注 0票数 1

您好,我有一个包含10000+行的数据帧,看起来像这样-

代码语言:javascript
复制
df = pd.DataFrame([['110', 'Demand', 2344, 30953], 
                   ['111', 'Supply', 3535, 321312], 
                   ['112', 'Supply', 35345, 2324], 
                   ['113', 'Demand', 24345, 4542], 
                   ['114', 'Supply', 342, 435623]], 
                  columns=['Material', 'Title', '201950', '201951'])
df

Material    Title   201950  201951
110         Demand  2344    30953
111         Supply  3535    321312
112         Supply  35345   2324
113         Demand  24345   4542
114         Supply  342     435623

我有另一个小的数据帧,大约有4-5行,看起来像这样-

代码语言:javascript
复制
extra = pd.DataFrame([['111', 'Supply', 10],
                     ['112', 'Supply', 20],
                     ['114', 'Supply', 30],
                     ['115', 'Supply', 40]],
                    columns=['Material', 'Title', '201950'])
extra
Material    Title   201950
111         Supply    10
112         Supply    20
114         Supply    30
115         Supply    40

我希望将df中列201950中的值替换为来自extra的值,只要MaterialTitle匹配,结果数据帧就会如下所示-

代码语言:javascript
复制
Material    Title   201950  201951
110         Demand   2344   30953
111         Supply     10   321312
112         Supply     20   2324
113         Demand   24345  4542
114         Supply     30   435623

我确实试过合并

代码语言:javascript
复制
updated = df.merge(extra, how='left',
                       on=['Material', 'Title'],
                       suffixes=('', '_new'))
new = '201950_new'
updated['201950'] = np.where(pd.notnull(updated[new]), updated[new], updated['201950'])
updated.drop(new, axis=1, inplace=True)

这为我提供了所需的输出。但我正在寻找一种更有效的解决方案。因为df很大,而extra只有4行。

EN

回答 2

Stack Overflow用户

发布于 2019-12-20 13:41:00

使用DataFrame.update,但首先在两个DataFrame中创建MultiIndex by MaterialTitle列:

代码语言:javascript
复制
df = df.set_index(['Material','Title'])
extra = extra.set_index(['Material','Title'])

df.update(extra)
df = df.astype(int).reset_index()
print (df)
  Material   Title  201950  201951
0      110  Demand    2344   30953
1      111  Supply      10  321312
2      112  Supply      20    2324
3      113  Demand   24345    4542
4      114  Supply      30  435623
票数 3
EN

Stack Overflow用户

发布于 2019-12-20 15:31:54

您可以尝试这样做:

代码语言:javascript
复制
extra.set_index(['Material','Title']).combine_first(df.set_index(['Material','Title'])).dropna().reset_index().astype(object) 

输出:

代码语言:javascript
复制
  Material   Title 201950  201951
0      110  Demand   2344   30953
1      111  Supply     10  321312
2      112  Supply     20    2324
3      113  Demand  24345    4542
4      114  Supply     30  435623
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59420315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档