python - 基于 2 个数据帧的 pandas 高效数据操作

这是我的带有 2 个数据帧的代码:

import pandas as pd
import numpy as np
df1 = pd.DataFrame(np.array([[1, 2, 3, 5, 2], [2, 2, 3, 5, 2], [3, 2, 3, 5, 2], [10, 2, 3, 5, 2]]),
                   columns=['ID', 'itemX_2', 'itemK_3', 'itemC_5', 'itemH_2'])
df2 = pd.DataFrame(np.array([[1,1,1, 2,2,2, 3,3,3, 10,10,10], [2,3,5, 2,3,5, 2,3,5, 2,3,5], [20,40,60, 80,100,200, 220,240,260, 500,505,520]]).T,
                   columns=['ID', 'Item_id', 'value_to_assign'])

基于df2我想修改df1

预期输出:

df_expected_output = pd.DataFrame(np.array([[1, 20, 40, 60, 20], [2, 80, 100, 200, 80], [3, 220, 240, 260, 220], [10, 500, 505, 520, 500]]),
                   columns=['ID', 'itemX_2', 'itemK_3', 'itemC_5', 'itemH_2'])

我已经通过遍历列和一些操作来完成它。在我的例子中,我在数据框中有更多的列和行,所以它很慢。有人知道如何以快速有效的方式做到这一点吗?谢谢

最佳答案

这是一种解决方案。 pivot df2 使其具有类似于 df1 的格式,然后通过匹配最后一个“_”之后的数字逐列替换。

df2_pivot = df2.pivot(index='ID', columns='Item_id', values='value_to_assign').rename_axis(None, axis=1)

df3 = df1.set_index('ID')
for c in df3:
    df3[c] = df2_pivot[int(c.rsplit('_', 1)[-1])]

或者,对第二部分使用字典理解:

df3 = pd.DataFrame({c: df2_pivot[int(c.rsplit('_', 1)[-1])]
                    for c in df1.columns[1:]},
                    index=df1['ID']).reset_index()

输出:

>>> df3.reset_index()
   ID  itemX_2  itemK_3  itemC_5  itemH_2
0   1       20       40       60       20
1   2       80      100      200       80
2   3      220      240      260      220
3  10      500      505      520      500

https://stackoverflow.com/questions/69302145/

相关文章:

javascript - 如何使用新的 Webpack devServer 配置?

r - 使用 dplyr 嵌套或分组两个变量,然后对数据执行 Cronbach's alpha 函数

html - 使用图像标签在网页上显示原始像素阵列

python - 如何减少由许多条件语句组成的函数?

r - 如果 R 中的其他列中存在值,则用于创建 T/F 列的 dplyr 解决方案

rust - Vec> 按第一个元素升序排序,当第一个元素相等时按第二个元素降序排

julia - Julia 中具有评估/计算属性的结构

c++ - C++20 中的新型自动生成构造函数

python - 如何使用 Python 加密大文件?

javascript - 在javascript中找到嵌套数组中的最低值