Eu criei o seguinte dataframe do pandas
import pandas as pd
import numpy as np
ds = {
'col1' :
[
['U', 'U', 'U', 'U', 'U', 1, 0, 0, 0, 'U','U', None],
[6, 5, 4, 3, 2],
[0, 0, 0, 'U', 'U'],
[0, 1, 'U', 'U', 'U'],
[0, 'U', 'U', 'U', None]
]
}
df = pd.DataFrame(data=ds)
O quadro de dados fica assim:
print(df)
col1
0 [U, U, U, U, U, 1, 0, 0, 0, U, U, None]
1 [6, 5, 4, 3, 2]
2 [0, 0, 0, U, U]
3 [0, 1, U, U, U]
4 [0, U, U, U, None]
Para cada linha em col1
, preciso verificar se cada elemento igual a U
na lista é seguido (da esquerda para a direita) por qualquer valor além de U
e None
: nesse caso eu criaria uma nova coluna (chamada iCount
) com valor 1. Caso contrário, 0.
No exemplo acima, o dataframe resultante ficaria assim:
col1 iCount
0 [U, U, U, U, U, 1, 0, 0, 0, U, U, None] 1
1 [6, 5, 4, 3, 2] 0
2 [0, 0, 0, U, U] 0
3 [0, 1, U, U, U] 0
4 [0, U, U, U, None] 0
Somente na primeira linha o valor U
é seguido por um valor que não é U
nem None
(é 1
)
Eu tentei este código:
col5 = np.array(df['col1'])
for i in range(len(df)):
iCount = 0
for j in range(len(col5[i])-1):
print(col5[i][j])
if((col5[i][j] == "U") & ((col5[i][j+1] != None) & (col5[i][j+1] != "U"))):
iCount += 1
else:
iCount = iCount
Mas recebo este dataframe (errado):
col1 iCount
0 [U, U, U, U, U, 1, 0, 0, 0, U, U, None] 0
1 [6, 5, 4, 3, 2] 0
2 [0, 0, 0, U, U] 0
3 [0, 1, U, U, U] 0
4 [0, U, U, U, None] 0
Alguém pode me ajudar por favor?
Experimente isto:
Saída:
Se você quiser apenas testar se há pelo menos um caso em que um não-None segue a
U
, useitertools.pairwise
eany
:Saída:
Se você também quiser verificar os outros valores até o próximo
U
, use uma função personalizada:Exemplo:
resposta original antes do esclarecimento
abordagem 1: considerando apenas o primeiro item após
U
IIUC, use uma função python personalizada:
Ou, para ser mais flexível com as condições:
Saída:
Exemplo mais complexo:
abordagem 2: considerando todos os valores após
U
:Basta recuar o sinalizador redefinido na abordagem anterior para redefini-lo apenas se um valor ainda não tiver sido encontrado:
Exemplo:
Código
df
Você pode usar
explode
,groupby
no índice e depois agregar com uma soma de quando a condição forTrue
:Se você precisar
'iCount'
conter apenas0
ou1
, e não uma soma dos valores que correspondem à condição, em vez desum
você pode usarany.astype(int)
:Use
np.vecorize
com uma função epd.Series
:Ou crie uma função minimalista com
zip
.Parece que o OP mencionou, os valores só podem ser
1
ou0
.Saída: