【问题标题】:efficient way to update dataframe column based on condition根据条件更新数据框列的有效方法
【发布时间】:2019-12-06 23:51:06
【问题描述】:

如果第二帧的条件适用,我想更新一个数据帧的值。

现在我正在遍历第二帧的每一行以查找它在第一帧中的位置,并在找到该行时更新该行,但这样的资源效率非常低。

有没有更好的合并方法?

例如,对于在 T2 中找到的值,我想在 T1 中将解析更新为“是”

T1
user_id   version        issue         Resolved
1         12345           crash           no   
2         12346           printing        no 
3         12347           screen          no
3         12348           screen          no


T2
user_id   version        issue 
1         12345           crash              
2         12346           printing              


谢谢!!

预期输出:

T1
user_id   version        issue         Resolved
1         12345           crash           yes   
2         12346           printing        yes 
3         12347           screen          no
3         12348           screen          no

【问题讨论】:

  • 有点困惑,你说你在循环,然后提到合并。为什么不直接合并然后挑选出改变的值呢?
  • 我在循环,我的意思是作为一个通用术语合并,但我知道这会造成混淆,对此感到抱歉。

标签: python pandas dataframe


【解决方案1】:

您可以在新数据中添加一个 yes 解析,然后将两者结合起来

T2['Resolved'] = 'yes'
dtypes = T1.dtypes.combine_first(T2.dtypes)
T3 = T2.combine_first(T1)
for k, v in dtypes.iteritems(): 
    T3[k] = T3[k].astype(v) 

输出:

   user_id  version     issue Resolved
0        1    12345     crash      yes
1        2    12346  printing      yes
2        3    12347    screen       no
3        3    12348    screen       no

我找到了一种无需转换回浮点数的组合方式:

T3 = T2.astype('object').combine_first(T1)

所以你不应该再需要 for 循环了

在 combine_first 不起作用的情况下检查此解决方案。我创建了一个映射到 yes 并将它们应用到第一帧:

T1 = pd.DataFrame({'A': [1,1,2,3], 'B': ['no', 'no','no','no'], 'C': ['no1', 'no2','no3','no4']})
T2 = pd.DataFrame({'A': [2, 3], 'B': ['yes','yes']})
mapitems = T2.set_index('A').to_dict()['B']   
T1['B'] = T1.apply(lambda x: mapitems[x.A] if x.A in mapitems.keys() else x.B, axis=1)

【讨论】:

  • @DiSt8885 我找到了一种让它更短的方法,不需要 dtypes 或 for 循环,在底部查看我的最新更新。这可能是我的熊猫版本中的一个错误,因为它将数字更改为浮点数,除非我添加那个 .astype 标签。我正在使用 0.25.3
  • 我可能是错的,但我进一步玩弄了这个,我注意到组合首先似乎使用索引而不是数据作为键值来连接数据。例如:T1 = pd.DataFrame({'A': [1,1,2,3], 'B': ['no', 'no','no','no']}) T2 = pd.DataFrame({'A': [2, 3], 'B': ['yes','yes']}) # df3 = df1.combine_first(df2) T3 = T2.astype('object').combine_first(T1) T3 不会在索引 2 和 3 中输入 yes,而是替换 A 和 B 列的索引值 0 和 1
  • @DiSt8885 检查我更新的答案,我使用字典将值映射回第一帧。
猜你喜欢
  • 2023-04-07
  • 1970-01-01
  • 2020-06-25
  • 2023-02-20
  • 2022-10-14
  • 2021-11-25
  • 1970-01-01
  • 2021-11-04
  • 1970-01-01
相关资源
最近更新 更多