有些代码说明了我的问题
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'])
基本上,在某些情况下,我想对条件较长的数据帧进行子集处理,并使用基于其他列的表达式替换值。这就是我最终编写它的方式,但是我认为可能有更好的方法
答案 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']