使用名为' 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'读'错误'。可以这样做吗?
答案 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