【问题标题】:Change value based on condition on slice of dataframe根据数据帧切片的条件更改值
【发布时间】:2022-12-23 21:40:38
【问题描述】:

我有一个这样的数据框:

df = pd.DataFrame(columns=['Dog', 'Small', 'Adult'])
df.Dog = ['Poodle', 'Shepard', 'Bird dog','St.Bernard']
df.Small = [1,1,0,0]
df.Adult = 0

看起来像这样:

       Dog         Small   Adult
0      Poodle          1   0
1      Shepard         1   0
2      Bird dog        0   0
3      St.Bernard      0   0

然后我想根据另一列更改一列。我可以这样做:

df.loc[df.Small == 0, 'Adult'] = 1

但是,我只想对前 3 行这样做。

我可以选择前三行:

df.iloc[0:2]

但是,如果我尝试更改前三行的值:

df.iloc[0:2, df.Small == 0, 'Adult'] = 1

我得到一个错误。

如果将两者合并,我也会收到错误消息:

df.iloc[0:2].loc[df.Small == 0, 'Adult'] = 1

它告诉我我正在尝试在切片的副本上设置一个值。

我应该如何正确执行此操作?

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    您可以将该范围作为另一个条件包含在您的.loc 选择中(对于一般情况,我将明确包含 0):

    df.loc[(df.Small == 0) & (0 <= df.index) & (df.index <= 2), 'Adult'] = 1
    

    另一种选择是将索引转换为系列以使用pd.Series.between

    df.loc[(df.Small == 0) & (df.index.to_series().between(0, 2)), 'Adult'] = 1
    

    【讨论】:

      【解决方案2】:

      只有当索引已经排序时,基于索引添加条件才有效。或者,您可以执行以下操作:

      ind = df[df.Small == 0].index[:2]
      df.loc[ind, 'Adult'] = 1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-02
        • 2017-08-27
        • 1970-01-01
        • 2015-01-25
        • 1970-01-01
        • 1970-01-01
        • 2012-02-01
        • 1970-01-01
        相关资源
        最近更新 更多