python - python pandas:将值设置为下一行 - 仅适用于某些行(根据条件)
问题描述
我有一些数据框。我想找到符合特定条件的行,并从下一行给这些行一个值。
例子:
我有以下df
>>> df = pd.DataFrame({"ID":range(1,11), "Label":["ABC","BBC","DAH","ACDC","CBA","DBS","HTG","PPP","HLM","AAA"]})
>>> df
ID Label
0 1 ABC
1 2 BBC
2 3 DAH
3 4 ACDC
4 5 CBA
5 6 DBS
6 7 HTG
7 8 PPP
8 9 HLM
9 10 AAA
我想将“标签”包含字母“H”的行的 ID 更改为下一行的 ID,所以它看起来像:
>>> df
ID Label
0 1 ABC
1 2 BBC
2 4 DAH
3 4 ACDC
4 5 CBA
5 6 DBS
6 8 HTG
7 8 PPP
8 10 HLM
9 10 AAA
我试过这个:
df.loc[df["Label"].str.contains("H"),"ID"] = df[df["Label"].str.contains("H").shift().fillna(False)]["ID"]
但它将 NaN 放在单元格中而不是 ID 中
>>> df
ID Label
0 1.0 ABC
1 2.0 BBC
2 NaN DAH
3 4.0 ACDC
4 5.0 CBA
5 6.0 DBS
6 NaN HTG
7 8.0 PPP
8 NaN HLM
9 10.0 AAA
反正有这样做吗?最好在一行中(或至少不必逐行迭代)
解决方案
尝试使用shift
with loc
,与您的尝试非常相似,但更简单:将ID
s 移动 1 where Label
contains H
。
df.loc[df.Label.str.contains('H'),'ID'] = df.ID.shift(-1)
>>> df
ID Label
0 1.0 ABC
1 2.0 BBC
2 4.0 DAH
3 4.0 ACDC
4 5.0 CBA
5 6.0 DBS
6 8.0 HTG
7 8.0 PPP
8 10.0 HLM
9 10.0 AAA
推荐阅读
- php - Auth0 - 登录后从用户信息获取规范化配置文件
- java - 将双精度数舍入到小数点后 2 位,显示“#.00”而不是“#.0”
- javascript - 最小化屏幕时如何使按钮显示?
- sql - 如何从 T-SQL 中的字符串内部删除空格
- javascript - 如何用逗号替换空格,然后在 jquery 中替换空格?
- sql - 如何用sql对同一范围内多条记录的开始日期和结束日期进行分组
- php - 根据页面中的内容量动态创建和分配变量的方法是什么
- css - Ionic 4 - 应用程序宽背景图像
- r - 使用 sunburst 的 plotly 工具提示问题
- javascript - 等待返回函数,直到操作完成