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

标签 python pandas dataframe numpy

这是我的带有 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

关于python - 基于 2 个数据帧的 pandas 高效数据操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69302145/

相关文章:

python - 使用嵌套列表理解来检查和更改数据框的所有列

python - 在特定值上打勾

python - 将 Mkdocs 部署到 Azure Web 应用

python - Pandas 数据框列删除第一个特定字符之前的字符串

python - 将 pandas DataFrame 列附加到 CSV

python - 从数据框的列中减去子列

python - 如何使 numpy 数组的列表都具有相同的形状?

python - 如何修复线性 SVM 的误报率?

python - 从两个数据框创建交互项

python - 如何动态链接 Pyspark 中的条件?