Mam taką ramkę danych,

col1    col2    col3
 1        A      T
 2        A      F
 3        N      N
 4        N      N
 5        B      T
 6        N      N
 7        B      F
 8        N      N
 9        A      T
 10       N      N
 11       N      N
 12       A      T
 13       N      N
 14       N      N
 15       A      T
 16       N      N
 17       A      F

Teraz chcę utworzyć nową ramkę danych z góry w taki sposób, aby z kolejnych N w col2 i col3 między każdym T i F w col3, wypełnij powyższą wartością non N z T. Zignoruj te, w których nadchodzi T lub F po T i F i.

Tak więc żądana ramka danych wygląda następująco:

col1    col2    col3
 1        A      T
 2        A      F
 3        N      N
 4        N      N
 5        B      T
 6        B      T
 7        B      F
 8        N      N
 9        A      T
 10       N      N
 11       N      N
 12       A      T
 13       N      N
 14       N      N
 15       A      T
 16       A      T
 17       A      F

Mógłbym to zrobić za pomocą pętli for i przechowywać indeksy, porównując następną i poprzednią wartość. Ale wykonanie zajmie więcej czasu. Szukam jakiegoś pythonowego sposobu / skrótów pandy, aby zrobić to wydajnie.

2
Kallol 20 listopad 2019, 19:02
4
Będziesz musiał podać znacznie szczegółowe wyjaśnienie swoich wymagań.
 – 
pault
20 listopad 2019, 19:05
Myślę, że wyjaśnienie jest dość jasne. W col3, jeśli N znajduje się między T a F, zastąp col2 i col3 poprzednim wierszem, jak w ffill .
 – 
Quang Hoang
20 listopad 2019, 19:28

1 odpowiedź

To jest moje podejście:

# mask T and F
TFs = df['col3'].mask(df['col3'].eq('N'))

after_T = TFs.ffill()
before_F = TFs.bfill()

# between
bt_TF = after_T.eq('T') & before_F.eq('F')

# mask and ffill:
df['col2'] = df['col2'].mask(bt_TF).ffill()
df['col3'] = df['col3'].mask(bt_TF).ffill()

Wynik:

    col1 col2 col3
0      1    A    T
1      2    A    F
2      3    N    N
3      4    N    N
4      5    B    T
5      6    B    T
6      7    B    F
7      8    N    N
8      9    A    T
9     10    N    N
10    11    N    N
11    12    A    T
12    13    N    N
13    14    N    N
14    15    A    T
15    16    A    T
16    17    A    F
1
Quang Hoang 20 listopad 2019, 19:23
Jest to znacznie prostsze niż podejście, którego używałem. +1
 – 
Scott Boston
20 listopad 2019, 19:35