【问题标题】:How to update values in multiple columns of a dataframe based on value of specific columns of another dataframe如何根据另一个数据框的特定列的值更新数据框的多列中的值
【发布时间】:2018-12-13 21:28:11
【问题描述】:

我有 2 个 padas 数据框

df1 = pd.DataFrame({'id': [1001,1002,1004],
                   'col1': ["a","b","d"],
                   'col2': [1,2,6]})

df2 = pd.DataFrame({'id': [1001,1002,1003,1004,1005,1006,1007],
                    'a': [10,10,10,10,10,10,10],
                    'b': [2,2,2,2,2,2,2],
                    'c': [1,2,3,4,5,6,7],
                    'd': [5,5,5,5,5,4,5],
                    'e': [0,3,4,6,7,5,5]})

df1 和 df2 存在共同的 id。

只要值出现在 df1.col1(例如“a”)中,就从对应的 df2 id 和列名中减去 df1.col2 值 =df1.col1 值(“a”)。

上面的说法可能会令人困惑,但我会尝试用一个例子来解释:

df1 id 1001 有 col1=a 和 col2=1

我想要做的是我想从 df2 的 a 列中减去 1 为 id 1001 =10-1=9

在另一个例子中

df1 id =1004 有 col1 值 =d 和 col2=6 所以从 df2 对应于 id 1004 =5-6=-1 的列 d 中减去 6 最终结果将如下所示

    a  b  c  d  e     id
0   9  2  1  5  0   1001
1  10  0  2  5  3   1002
2  10  2  3  5  4   1003
3  10  2  4 -1  6   1004
4  10  2  5  5  7   1005
5  10  2  6  4  5   1006
6  10  2  7  5  5   1007

我应该如何在 Pandas 中有效地解决这个问题,因为我必须在大型数据集上重复这个练习很多次。

提前致谢

【问题讨论】:

  • 您只需将轴参数传递给您的函数,它将按行而不是列工作

标签: python pandas dataframe


【解决方案1】:

如下使用lambda

    df1.apply(lambda row : updateDF2(row), axis=1)

完整的示例代码是

import pandas as pd
df1 = pd.DataFrame({'id': [1001,1002,1004],
                   'col1': ["a","b","d"],
                   'col2': [1,2,6]})

df2 = pd.DataFrame({'id': [1001,1002,1003,1004,1005,1006,1007],
                    'a': [10,10,10,10,10,10,10],
                    'b': [2,2,2,2,2,2,2],
                    'c': [1,2,3,4,5,6,7],
                    'd': [5,5,5,5,5,4,5],
                    'e': [0,3,4,6,7,5,5]})
def updateDF2(row):
    df2.loc[df2["id"] == row["id"], row["col1"]] -= row["col2"]

#df1.apply(lambda row : updateDF2(row), axis=1)
df1.apply(updateDF2, axis=1)

print(df2)

输出是

    a  b  c  d  e    id
0   9  2  1  5  0  1001
1  10  0  2  5  3  1002
2  10  2  3  5  4  1003
3  10  2  4 -1  6  1004
4  10  2  5  5  7  1005
5  10  2  6  4  5  1006
6  10  2  7  5  5  1007
[Finished in 0.9s]

【讨论】:

  • 我认为df1.apply(updateDF2, axis=1) 应该足够了
猜你喜欢
  • 2019-11-23
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-26
  • 2023-01-18
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多