首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >有条件地将一个Pandas dataframe的列插入另一个dataframe的列中

有条件地将一个Pandas dataframe的列插入另一个dataframe的列中
EN

Stack Overflow用户
提问于 2021-03-19 04:18:16
回答 2查看 44关注 0票数 2

我有两个数据:

代码语言:javascript
复制
dfA = pd.DataFrame({'label':[1,5,2,4,2,3],
                    'group':['A']*3 + ['B']*3,
                    'x':[np.nan]*3 + [1,2,3],
                    'y':[np.nan]*3 + [1,2,3]})

dfB = pd.DataFrame({'uniqid':[1,2,3,4,5,6,7],
                    'horizontal':[34,41,23,34,23,43,22],
                    'vertical':[98,67,19,57,68,88,77]})

...which看起来像:

代码语言:javascript
复制
   label group    x    y
0      1     A  NaN  NaN
1      5     A  NaN  NaN
2      2     A  NaN  NaN
3      4     B  1.0  1.0
4      2     B  2.0  2.0
5      3     B  3.0  3.0


   uniqid  horizontal  vertical
0       1          34        98
1       2          41        67
2       3          23        19
3       4          34        57
4       5          23        68
5       6          43        88
6       7          22        77

基本上,dfB包含所有唯一ID的“水平”和“垂直”值。我想用dfA中的'x‘和'y’列填充dfB中的‘水平’和‘垂直’值,但只对A组;B组的数据应该保持不变。

预期的产出将是:

代码语言:javascript
复制
   label group    x    y
0      1     A 34.0 98.0
1      5     A 23.0 68.0
2      2     A 41.0 67.0
3      4     B  1.0  1.0
4      2     B  2.0  2.0
5      3     B  3.0  3.0

我使用.merge()向A组和B组的dataframe中添加了额外的列,然后仅将数据复制到组A的x和y列。最后从dfB中删除列。

代码语言:javascript
复制
dfA = dfA.merge(dfB, how = 'left', left_on = 'label', right_on = 'uniqid')

dfA.loc[dfA['group'] == 'A','x'] = dfA.loc[dfA['group'] == 'A','horizontal'] 
dfA.loc[dfA['group'] == 'A','y'] = dfA.loc[dfA['group'] == 'A','vertical'] 

dfA = dfA[['label','group','x','y']]

产生正确的输出:

代码语言:javascript
复制
   label group     x     y
0      1     A  34.0  98.0
1      5     A  23.0  68.0
2      2     A  41.0  67.0
3      4     B   1.0   1.0
4      2     B   2.0   2.0
5      3     B   3.0   3.0

...but --这是一个非常非常丑陋的解决方案。有没有更好的解决办法?

EN

Stack Overflow用户

回答已采纳

发布于 2021-03-19 04:22:42

我们可以尝试loc只提取/更新我们想要的部分。而且,由于您在一个列上合并,它在dfB上也具有唯一的值,所以可以使用set_indexloc/reindex

代码语言:javascript
复制
mask = dfA['group']=='A'
dfA.loc[ mask, ['x','y']] = (dfB.set_index('uniqid')
                                .loc[dfA.loc[mask,'label'],
                                     ['horizontal','vertical']]
                                .values
                            )

输出:

代码语言:javascript
复制
   label group     x     y
0      1     A  34.0  98.0
1      5     A  23.0  68.0
2      2     A  41.0  67.0
3      4     B   1.0   1.0
4      2     B   2.0   2.0
5      3     B   3.0   3.0

请注意,如果某些dfA.label不在dfB.uniqueid中,则上述操作将失败。在这种情况下,我们需要使用reindex

代码语言:javascript
复制
(dfB.set_index('uniqid')
    .reindex[dfA.loc[mask,'label']
    [['horizontal','vertical']].values
)
票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66702439

复制
相关文章

相似问题

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