Как заблокировать фрейм данных, который последовательно удовлетворяет условию? - PullRequest
1 голос
/ 20 сентября 2019

У меня есть следующий фрейм данных, и я пытаюсь написать сценарий, чтобы вывести число «5» под столбцом времени, где «5» - это значение, в котором «col» постоянно равно 1.

import pandas as pd
df = pd.DataFrame({'time': [1,2,3,4,5,6,7,8,9,10], 'col': [0,1,0,0,1,1,1,1,1,1]})
print(df)

   time  col
0     1    0
1     2    1
2     3    0
3     4    0
4     5    1
5     6    1
6     7    1
7     8    1
8     9    1
9    10    1

Что было бы хорошим способом добиться этого?

Спасибо

Ответы [ 2 ]

1 голос
/ 20 сентября 2019

Я понимаю, что вы ищете что-то вроде этого:

cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
cond2=(cond1.eq(False))&(cond1.shift(-1).eq(True))
df['time']=df['time'].where(cond2|(~cond1)).ffill().fillna(df['time'])

print(df)
   time  col
0   1.0    0
1   2.0    1
2   3.0    0
3   4.0    0
4   5.0    1
5   5.0    1
6   5.0    1
7   5.0    1
8   5.0    1
9   5.0    1

Объяснение:

Используя cond1, вы выбираете значения, которые имеютподлежит замене

print(cond1)

0    False
1    False
2    False
3    False
4    False
5     True
6     True
7     True
8     True
9     True
Name: col, dtype: bool

Используя cond2, вы выбираете значение, на которое оно должно быть заменено

print(cond2)


0    False
1    False
2    False
3    False
4     True
5    False
6    False
7    False
8    False
9    False
Name: col, dtype: bool

на реальный набор данных:

df = pd.DataFrame({'time': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 'col': [0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1]})
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
print(df)

    time  col
0      1    0
1      2    0
2      3    0
3      4    1
4      5    1
5      6    1
6      7    0
7      8    0
8      9    0
9     10    0
10    11    0
11    12    1
12    13    1
13    14    1
14    15    1
15    16    1
16    17    1
17    18    1
18    19    1
19    20    1

cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
cond2=(cond1.eq(False))&(cond1.shift(-1).eq(True))
df['time']=df['time'].where(cond2|(~cond1)).ffill().fillna(df['time'])
print(df)


  time  col
0    1.0    0
1    2.0    0
2    3.0    0
3    4.0    1
4    4.0    1
5    4.0    1
6    7.0    0
7    8.0    0
8    9.0    0
9   10.0    0
10  11.0    0
11  12.0    1
12  12.0    1
13  12.0    1
14  12.0    1
15  12.0    1
16  12.0    1
17  12.0    1
18  12.0    1
19  12.0    1
0 голосов
/ 21 сентября 2019

Вот реальный набор данных

df = pd.DataFrame({'time': [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20], 'col': [0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1,1,1]})
cond1=df['col'].shift().ffill().eq(df.loc[df['col'].eq(1),'col'])
df['cond1'] = cond1
print(df)

Output
    time  col  cond1
0      1    0  False
1      2    0  False
2      3    0  False
3      4    1  False
4      5    1   True
5      6    1   True
6      7    0  False
7      8    0  False
8      9    0  False
9     10    0  False
10    11    0  False
11    12    1  False
12    13    1   True
13    14    1   True
14    15    1   True
15    16    1   True
16    17    1   True
17    18    1   True
18    19    1   True
19    20    1   True

Мое намерение пытается определить время 13.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...