为了账号安全,请及时绑定邮箱和手机立即绑定

避免多次在 pandas 中编写相同的 .loc

避免多次在 pandas 中编写相同的 .loc

GCT1015 2022-10-18 16:09:43
这是一些说明我的问题的代码import pandas as pdimport numpy as np# Create random dataframedf = pd.DataFrame({'col1': np.random.randint(0, 9, 10),                   'col2': np.random.randint(0, 9, 10),                   'col3': np.random.randint(0, 9, 10)})# Can this be written in a better way?df.loc[df['col1'] > df['col2'], 'col3'] = (df.loc[df['col1'] > df['col2'], 'col2'] +                                           df.loc[df['col1'] > df['col2'], 'col3'])基本上,在某些情况下,我想对具有较长条件的数据框进行子集化,并用基于其他列的表达式替换值。这就是我最终写它的方式,但我认为可能有更好的方法来做到这一点
查看完整描述

2 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

您可以创建一个mask, 在这个特定的求和操作中,您可以通过以下方式进行简化+=:


mask = df['col1'] > df['col2']

df.loc[mask, 'col3'] += df.loc[mask, 'col2']

如果您想创建一个子集,您可以尝试以下操作:


mask = df['col1']>df['col2']

tmp_df = df.loc[mask, ['col2', 'col3']]

# here you could do whatever on tmp_df without modifying df like

tmp_df *= 2 # just as example

# them assign the value back to df only for the rows and columns you want

df.loc[mask, 'col3'] = tmp_df.sum(axis=1)

但是你仍然需要mask在loc'col3'中分配值时。等式右边的操作可能更容易阅读


查看完整回答
反对 回复 2022-10-18
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

如果您没有重复的索引,您可以尝试:

df.loc[df['col1'] > df['col2'], 'col3'] = df['col2'] +  df['col3']


查看完整回答
反对 回复 2022-10-18
  • 2 回答
  • 0 关注
  • 99 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信