python pandas: установить значение для следующей строки - только для определенных строк (согласно условию) - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть некоторый фрейм данных.Я хочу найти строки, которые соответствуют определенному условию, и дать этим строкам значение из следующей строки.

Пример:

У меня есть следующее 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», на идентификатор следующей строки, поэтому он будет выглядеть следующим образом:

>>> 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

>>> 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 голосов
/ 28 ноября 2018

Попробуйте использовать shift с loc, очень похоже на вашу попытку, но несколько проще: сдвиньте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...