首页 > 解决方案 > Pandas:在过滤的数据框中选择行范围和列

问题描述

假设我有这样的数据:

df = pd.DataFrame({'category': ["blue","blue","blue", "blue","green"], 'val1': [5, 3, 2, 2, 5], 'val2':[1, 3, 2, 2, 5]})
print(df)

  category  val1  val2
0     blue     5     1
1     blue     3     3
2     blue     2     2
3     blue     2     2
4    green     5     5

我想按类别过滤,然后选择一列和一个行范围,如下所示:

print(df.loc[df['category'] == 'blue'].loc[1:2, 'val1'])

1    3
2    2
Name: val1, dtype: int64

这适用于选择我感兴趣的数据,但是当我尝试用上面选择的数据覆盖我的数据框的一部分时,我得到A value is trying to be set on a copy of a slice from a DataFrame.

我熟悉此错误消息,并且我知道在尝试使用选择的数据框覆盖某些内容时会发生这种情况,df.loc[columns].loc[rows]而不是df.loc[columns, rows].

但是,我无法弄清楚如何将我要过滤的所有 3 件事(类别的某个值、某个列和某个行范围)放入一个.loc[...]. 如何以可以使用它覆盖部分数据帧的方式选择部分数据?

标签: pythonpandasdataframe

解决方案


这是有道理的,因为您正在链接两个 loc 调用。我的建议是将两个 loc 调用压缩在一起。您可以通过过滤来做到这一点,然后抓取索引并在另一个中使用loc

df.loc[df[df['category'].eq('blue')].index[1:3], 'val1'] = 123

请注意,我必须使用df.index[1:3]而不是df.index[1:2]因为结束范围不包括位置切片(与loc基于标签的切片不同)。


推荐阅读