按条件统计熊猫连续发生的次数

时间:2019-04-05 15:11:34

标签: python pandas dataframe data-analysis

我有以下数据框:

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中消失一次,仅{strong>一次消失,B消失了0次,而C消失了3次(分别在20063、20071和20081)

我要执行以下操作:

  1. 按时间消失的总数(此示例中的列,因此在20063年消失了一次,在20072年再次消失了等)
  2. 按类型:A在20074年消失了一次,C在20063、20071和20081年消失了3次
  3. 失踪总数(此处为4)

有人可以帮我在python中做到这一点吗?

我的数据框很大,因此,理想情况下,我会寻找通用的解决方案。

谢谢

2 个答案:

答案 0 :(得分:2)

您可以使用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 :(得分:1)

首先mask全部为0到NaN,然后对每一行执行ffill,并找到新的df与原始行之间的差异,sum < / p>

(df.mask(df==0).ffill(1).fillna(0)!=df).sum(1)
Out[146]: 
A    1
B    0
C    3
dtype: int64