python - 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[...]
. 如何以可以使用它覆盖部分数据帧的方式选择部分数据?
解决方案
这是有道理的,因为您正在链接两个 loc 调用。我的建议是将两个 loc 调用压缩在一起。您可以通过过滤来做到这一点,然后抓取索引并在另一个中使用loc
:
df.loc[df[df['category'].eq('blue')].index[1:3], 'val1'] = 123
请注意,我必须使用df.index[1:3]
而不是df.index[1:2]
因为结束范围不包括位置切片(与loc
基于标签的切片不同)。
推荐阅读
- c# - 如何将面板设置为统一实例化预制件的父级?
- c++ - 在cpp中将十六进制字符串转换为字符数组
- python - 是否有可以处理数组输入的python阶乘函数?
- c++ - 如何在 centos 中使用更新选项?
- python - 累计配电线路
- excel-formula - 间接公式 = 间接(H9&"1:1")
- reactjs - 如何使用 Cookie 进行存储 jwt 令牌用户认证?
- php - 如何在 WooCommerce 的结帐页面上禁用更改运输方式的功能
- javascript - Cordova "Origin: file://"-Error using and Android 10, old versions working
- mysql - 如何多次选择一行,每行附加不同的值?