python pandas:将值设置为下一行-仅针对某些行(根据条件)

时间:2018-11-28 16:07:15

标签: python pandas dataframe

我有一些数据框。 我想查找符合特定条件的行,并为这些行提供下一行的值。

示例:

我有以下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

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

1 个答案:

答案 0 :(得分:0)

尝试将shiftloc一起使用,与您的尝试非常相似,但更简单:将ID移1,其中Label包含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