python - 根据 Pandas 数据框中的键列减去列

标签 python python-3.x pandas dataframe

我有两个数据框看起来像

df1:

   ID    A   B   C   D 
0 'ID1' 0.5 2.1 3.5 6.6
1 'ID2' 1.2 5.5 4.3 2.2
2 'ID1' 0.7 1.2 5.6 6.0 
3 'ID3' 1.1 7.2 10. 3.2

df2:

   ID    A   B   C   D 
0 'ID1' 1.0 2.0 3.3 4.4
1 'ID2' 1.5 5.0 4.0 2.2
2 'ID3' 0.6 1.2 5.9 6.2 
3 'ID4' 1.1 7.2 8.5 3.0

df1 可以有多个具有相同 ID 的条目,而每个 ID 在 df2 中只出现一次。也并非 df2 中的所有 ID 都必须出现在 df1 中。我无法通过使用 set_index() 来解决这个问题,因为 df1 中的多行可以具有相同的 ID,并且 df1 中的 ID 和df2 未对齐。

我想创建一个新的数据框,我从 df1[[ 中减去 df2[['A','B','C','D']] 中的值'A','B','C','D']] 基于匹配ID。

生成的数据框如下所示:

df_new:

   ID     A    B   C   D 
0 'ID1' -0.5  0.1 0.2 2.2
1 'ID2' -0.3  0.5 0.3 0.0
2 'ID1' -0.3 -0.8 2.3 1.6
3 'ID3'  0.5  6.0 1.5 0.2

我知道如何使用循环执行此操作,但由于我要处理大量数据,所以这根本不实用。使用 Pandas 解决此问题的最佳方法是什么?

最佳答案

你只需要set_index并减去

(df1.set_index('ID')-df2.set_index('ID')).dropna(axis=0)
Out[174]: 
         A    B    C    D
ID                       
'ID1' -0.5  0.1  0.2  2.2
'ID1' -0.3 -0.8  2.3  1.6
'ID2' -0.3  0.5  0.3  0.0
'ID3'  0.5  6.0  4.1 -3.0

如果顺序很重要,请为 df2 添加 reindex

(df1.set_index('ID')-df2.set_index('ID').reindex(df1.ID)).dropna(axis=0).reset_index()
Out[211]: 
      ID    A    B    C    D
0  'ID1' -0.5  0.1  0.2  2.2
1  'ID2' -0.3  0.5  0.3  0.0
2  'ID1' -0.3 -0.8  2.3  1.6
3  'ID3'  0.5  6.0  4.1 -3.0

关于python - 根据 Pandas 数据框中的键列减去列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50158152/

相关文章:

python - y 轴上 matplotlib 中的百分比符号

python - 为什么我的 Sympy 代码会错误地计算一阶泰勒级数近似值?

python - 我不希望 psycopg2 在查询结果中转义换行符 (\n)

python - 如何在python中读取动态生成的文件并建立索引

python - Python 中的 Jupyter Lab 中不显示 Plotly 表?

python Pandas : How to set the name of multiindex?

python - 如何处理查询参数编码?

python - 无法从请求 python 获取完整表

python - 如何在keras中为给定数据点指定多个标签?

python - 为 Python 3.x 编译 Python C 模块时未定义 PY_MAJOR_VERSION