pandas – 有效地设置行子集的值

我想知道在数据框中更改行子集中的值的最佳方法.

假设我想在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和哪里有什么区别?

最佳答案 您的#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时创建或更改值,这将特别有用.

点赞