gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:59:45 26 4
gpt4 key购买 nike

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

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com