我想知道最好的方法来更改数据框中的行的子集中的值。
假设我要在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会为所有行实际进行计算,然后为除选定行之外的所有行丢弃结果吗?
在评估方面,使用
loc
和where
有什么区别吗? 最佳答案
您的#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/