Pandas 有效地设置行子集上的值

Pandas 有效地设置行子集上的值,pandas,Pandas,我想知道改变数据帧中行子集中的值的最佳方法。 假设我想将value列中的值加倍,其中selected为true In [1]: import pandas as pd In [2]: df = pd.DataFrame({'value': [1, 2, 3, 4], 'selected': [False, False, True, True]}) In [3]: df Out[3]: selected value 0 False 1 1 False 2 2

我想知道改变数据帧中行子集中的值的最佳方法。 假设我想将
value
列中的值加倍,其中
selected
为true

In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'value': [1, 2, 3, 4], 'selected': [False, False, True, True]})
In [3]: df
Out[3]: 
  selected  value
0    False      1
1    False      2
2     True      3
3     True      4
有几种方法可以做到这一点:

# 1. Subsetting with .loc on left and right hand side:
df.loc[df['selected'], 'value'] = df.loc[df['selected'], 'value'] * 2

# 2. Subsetting with .loc on left hand side:
df.loc[df['selected'], 'value'] = df['value'] * 2

# 3. Using where()
df['value'] = (df['value'] * 2).where(df['selected'], df['value'])
如果我只在左侧创建子集(选项2),Pandas是否会对所有行进行计算,然后放弃除选定行以外的所有行的结果

在评估方面,使用
loc
where
之间有什么区别吗?

您的#2选项是最标准和推荐的方法。您的#1选项也很好,但额外的代码是不必要的,因为
ix/loc/iloc
旨在通过布尔选择并进行必要的对齐,以确保它仅适用于所需的子集

# 2. Subsetting with .loc on left hand side:
df.loc[df['selected'], 'value'] = df['value'] * 2
如果您不在左手边使用
ix/loc/iloc
,可能会出现我们不想在简单回答中讨论的问题。因此,使用
ix/loc/iloc
通常是最安全和最推荐的方法。你的选项3没有错,但它是三个选项中可读性最低的一个

您应该知道的一个更快且可接受的替代方法是numpy的
where()
函数:

df['value'] = np.where( df['selected'], df['value'] * 2, df['value'] )
第一个参数是选择或掩码,第二个参数是True时要指定的值,第三个参数是false时要指定的值。如果要在选择为False时也创建或更改值,则该选项尤其有用