pandas dataframe - 查找具有特定条件的最长连续行

时间:2016-10-16 08:10:22

标签: python pandas dataframe

使用名为' df'的pandas数据帧如下

             A
2015-05-01  True
2015-05-02  True
2015-05-03  False
2015-05-04  False
2015-05-05  False
2015-05-06  False
2015-05-07  True
2015-05-08  False
2015-05-09  False

我想返回一个切片,这是最长的连续行数,其中列' A'读'错误'。可以这样做吗?

2 个答案:

答案 0 :(得分:3)

您可以使用 A / | \ B1 B2 B3 | A1 来检测cumsum列中的更改,因为python中的A可以求和。

boolean

答案 1 :(得分:1)

很抱歉带回一个旧帖子,但是我注意到Romain的回答结果略有偏离-计数不正确,这会导致结果不准确。计数列中应该有4个项目:[2、4、1、2],最大为4。

为演示该问题-我对其进行了细分(df与上面接受的答案相同)。您会看到生成的组不正确:

# sort
dfS = df.sort_index(inplace=True)
# reset
dfSR = dfS.reset_index(inplace=True)
# group
dfG = dfSR.groupby(df['A'].cumsum())

# show resulting groups
for group in dfG: print(group)

# (1,        index     A
# 0 2015-05-01  True)
# (2,        index      A
# 1 2015-05-02   True
# 2 2015-05-03  False
# 3 2015-05-04  False
# 4 2015-05-05  False
# 5 2015-05-06  False)
# (3,        index      A
# 6 2015-05-07   True
# 7 2015-05-08  False
# 8 2015-05-09  False)

感谢DSM here的回答,当然也感谢Romain的回答,将两个帖子的技术结合起来即可得到答案。它们的来源已经对它们进行了说明,因此我将其留在下面的代码中。

import pandas as pd

df = pd.DataFrame([True, True, False, False, False, False, True, False, False], 
              index=pd.to_datetime(['2015-05-01', '2015-05-02', '2015-05-03',
                                   '2015-05-04', '2015-05-05', '2015-05-06',
                                   '2015-05-07', '2015-05-08', '2015-05-09']), 
              columns=['A'])

df.sort_index(inplace=True)
df.reset_index(inplace=True)

dfBool = df['A'] != df['A'].shift()
dfCumsum = dfBool.cumsum()

groups = df.groupby(dfCumsum)

for g in groups: print(g)

groupCounts = groups.agg({'index':['count', 'min', 'max']})
groupCounts.columns = groupCounts.columns.droplevel()

print('\n', groupCounts, '\n')

maxCount = groupCounts[groupCounts['count'] == groupCounts['count'].max()]

print(maxCount, '\n')

输出:

(1,        index     A
0 2015-05-01  True
1 2015-05-02  True)
(2,        index      A
2 2015-05-03  False
3 2015-05-04  False
4 2015-05-05  False
5 2015-05-06  False)
(3,        index     A
6 2015-05-07  True)
(4,        index      A
7 2015-05-08  False
8 2015-05-09  False)

    count        min        max
A                             
1      2 2015-05-01 2015-05-02
2      4 2015-05-03 2015-05-06
3      1 2015-05-07 2015-05-07
4      2 2015-05-08 2015-05-09 

   count        min        max
A                             
2      4 2015-05-03 2015-05-06