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

时间:2020-04-22 11:39:38

标签: python pandas

有些代码说明了我的问题

import pandas as pd
import numpy as np

# Create random dataframe
df = 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 个答案:

答案 0 :(得分:3)

您可以创建一个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)

,但是在分配'col3'中的值时,仍然需要mask中的loc。方程右侧的运算可能更容易阅读

答案 1 :(得分:2)

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

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