рассчитывать последовательные вхождения по состоянию в пандах - PullRequest
0 голосов
/ 05 апреля 2019

У меня есть следующий фрейм данных:

data = {'A': [0,0,0,1,1,1,0,1], 'B': [0,1,1,1,1,1,1,1], 'C': [1,0,1,0,1,1,1,0]}
df=pd.DataFrame(data)
df=df.transpose()
columns={'0':'population'}
df=df.rename(index=str, columns={0: "20062", 1: "20063", 2: "20064", 3: "20071", 4: "20072", 5: "20073", 6: "20074", 7: "20081"})


Out[135]: 
   20062  20063  20064  20071  20072  20073  20074  20081
A      0      0      0      1      1      1      0      1
B      0      1      1      1      1      1      1      1
C      1      0      1      0      1      1      1      0

Моя основная задача - найти количество "исчезновений"

«Исчезновение» позволяет нам определить случай, когда за 0 следует после 1

Итак, ожидаемый результат в этом примере: A исчезает только один раз в 20074, B исчезает ноль раз, в то время как C исчезает 3 раза (в 2006,20071, и 20081 соответственно)

Я хочу сделать следующее:

  1. общее количество исчезновений по времени (столбцы в этом примере, поэтому в 2006 г.3 было одно исчезновение, снова 1 в 2007 г.2 и т. Д.)
  2. по типу: A исчез один раз в 2007 году4, C исчез 3 раза в 2006 году3, 20071 и 20081
  3. общее количество исчезновений (здесь 4)

Может кто-нибудь помочь, как я могу сделать это в Python.

Мой фрейм данных довольно большой, поэтому в идеале я бы искал общее решение.

Спасибо

Ответы [ 2 ]

2 голосов
/ 05 апреля 2019

Вы можете использовать diff и суммировать по axis=None, чтобы получить общее количество исчезновений

>>> df.diff(axis=1).eq(-1).values.sum(axis=None)
4

Чтобы получить по строке, sum по axis=1

df.diff(axis=1).eq(-1).sum(axis=1)

A    1
B    0
C    3
dtype: int64

Кполучить за раз, sum через axis=0

df.diff(axis=1).eq(-1).sum(axis=0)

20062    0
20063    1
20064    0
20071    1
20072    0
20073    0
20074    1
20081    1
dtype: int64
1 голос
/ 05 апреля 2019

Сначала mask все от 0 до NaN, затем мы делаем ffill для каждой строки и находим разницу между этим новым значением df и исходным, sum it

(df.mask(df==0).ffill(1).fillna(0)!=df).sum(1)
Out[146]: 
A    1
B    0
C    3
dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...