我想知道最好的方法来更改数据框中的行的子集中的值。
假设我要在value为true的行中将selected列中的值加倍。

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会为所有行实际进行计算,然后为除选定行之外的所有行丢弃结果吗?

在评估方面,使用locwhere有什么区别吗?

最佳答案

您的#2选项是执行此操作的最标准和推荐的方法。您的#1选项也很好,但是多余的代码是不必要的,因为ix/loc/iloc旨在传递 bool 选择并进行必要的对齐,以确保它仅适用于所需的子集。

# 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的情况下也创建或更改值,则此功能特别有用。

关于pandas - 在行的子集上有效地设置值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36063634/

10-12 16:35