Python Pandas—参数为“的持续时间”;1“;

Python Pandas—参数为“的持续时间”;1“;,python,pandas,group-by,Python,Pandas,Group By,我是python和pandas的新手,我正在尝试解决这个问题: 我有一个类似以下内容的数据集: timestamp par_1 par_2 1486873206867 0 0 1486873207039 NaN 0 1486873207185 0 NaN 1486873207506 1 0 1486873207518 NaN NaN 1486873207831 1 0 1486873208148 0 NaN

我是python和pandas的新手,我正在尝试解决这个问题:

我有一个类似以下内容的数据集:

timestamp       par_1 par_2
1486873206867   0     0
1486873207039   NaN   0
1486873207185   0     NaN
1486873207506   1     0
1486873207518   NaN   NaN
1486873207831   1     0
1486873208148   0     NaN
1486873208469   0     1
1486873208479   1     NaN
1486873208793   1     NaN
1486873208959   NaN   1
1486873209111   1     NaN
1486873209918   NaN   0
1486873210075   0     NaN
timestamp       par_1 par_2  duration_par_1  duration_par2
1486873206867   0     0      2238            1449
1486873207039   NaN   0      2238            1449
1486873207185   0     NaN    2238            1449
1486873207506   1     0      2238            1449
1486873207518   NaN   NaN    2238            1449
1486873207831   1     0      2238            1449
1486873208148   0     NaN    2238            1449
1486873208469   0     1      2238            1449
1486873208479   1     NaN    2238            1449
1486873208793   1     NaN    2238            1449
1486873208959   NaN   1      2238            1449
1486873209111   1     NaN    2238            1449
1486873209918   NaN   0      2238            1449
1486873210075   0     NaN    2238            1449
我想知道每个参数的事件“1”的总持续时间。(参数只能是NaN、1或0)

我已经试过了

df['duration\u par\u 1']=df.groupby(['par\u 1'])['timestamp'].apply(lambda x:x.max()-x.min())

但为了进一步处理,我只需要事件“1”的持续时间在新列中,然后该持续时间需要在新列的每一行中,这样它看起来像这样:

timestamp       par_1 par_2
1486873206867   0     0
1486873207039   NaN   0
1486873207185   0     NaN
1486873207506   1     0
1486873207518   NaN   NaN
1486873207831   1     0
1486873208148   0     NaN
1486873208469   0     1
1486873208479   1     NaN
1486873208793   1     NaN
1486873208959   NaN   1
1486873209111   1     NaN
1486873209918   NaN   0
1486873210075   0     NaN
timestamp       par_1 par_2  duration_par_1  duration_par2
1486873206867   0     0      2238            1449
1486873207039   NaN   0      2238            1449
1486873207185   0     NaN    2238            1449
1486873207506   1     0      2238            1449
1486873207518   NaN   NaN    2238            1449
1486873207831   1     0      2238            1449
1486873208148   0     NaN    2238            1449
1486873208469   0     1      2238            1449
1486873208479   1     NaN    2238            1449
1486873208793   1     NaN    2238            1449
1486873208959   NaN   1      2238            1449
1486873209111   1     NaN    2238            1449
1486873209918   NaN   0      2238            1449
1486873210075   0     NaN    2238            1449

提前谢谢

我相信您需要根据日期时间的不同来设置
par
列的多个值,因为数据中不存在另一个值,如
0
1
NaN

d = df['timestamp'].diff()
df1 = df.filter(like='par')
#if need duration by some value e.g. by `0`
#df1 = df.filter(like='par').eq(0).astype(int)
s = df1.mul(d, axis=0).sum().astype(int).add_prefix('duration_')

df = df.assign(**s)
print (df)
        timestamp  par_1  par_2  duration_par_1  duration_par_2
0   1486873206867    0.0    0.0            1110             487
1   1486873207039    NaN    0.0            1110             487
2   1486873207185    0.0    NaN            1110             487
3   1486873207506    1.0    0.0            1110             487
4   1486873207518    NaN    NaN            1110             487
5   1486873207831    1.0    0.0            1110             487
6   1486873208148    0.0    NaN            1110             487
7   1486873208469    0.0    1.0            1110             487
8   1486873208479    1.0    NaN            1110             487
9   1486873208793    1.0    NaN            1110             487
10  1486873208959    NaN    1.0            1110             487
11  1486873209111    1.0    NaN            1110             487
12  1486873209918    NaN    0.0            1110             487
13  1486873210075    0.0    NaN            1110             487
说明

首先获取
时间戳
列的差异:

print (df['timestamp'].diff())
0       NaN
1     172.0
2     146.0
3     321.0
4      12.0
5     313.0
6     317.0
7     321.0
8      10.0
9     314.0
10    166.0
11    152.0
12    807.0
13    157.0
Name: timestamp, dtype: float64
通过以下方式选择具有字符串
par
的所有列:

d
筛选的多个列:

print (df1.mul(d, axis=0))
    par_1  par_2
0     NaN    NaN
1     0.0    0.0
2     0.0    0.0
3   321.0    0.0
4     0.0    0.0
5   313.0    0.0
6     0.0    0.0
7     0.0  321.0
8    10.0    0.0
9   314.0    0.0
10    0.0  166.0
11  152.0    0.0
12    0.0    0.0
13    0.0    0.0
和<代码>总和<代码>值:

print (df1.mul(d, axis=0).sum())
par_1    1110.0
par_2     487.0
dtype: float64
转换为
整数
s并通过以下方式更改索引:


上次创建新列的人。

谢谢!使用值不能大于1这一事实是明智的。@cnila-是的,我也对这一事实感到高兴,解决方案更容易;)