首页 > 解决方案 > 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

反正有这样做吗?最好在一行中(或至少不必逐行迭代)

标签: pythonpandasdataframe

解决方案


尝试使用shiftwith loc,与您的尝试非常相似,但更简单:将IDs 移动 1 where Labelcontains 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

推荐阅读