我有以下数据框:
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)
我要执行以下操作:
有人可以帮我在python中做到这一点吗?
我的数据框很大,因此,理想情况下,我会寻找通用的解决方案。
谢谢
答案 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