Python 2.7 熊猫数据帧具有不间断数据的最长系列

Python 2.7 熊猫数据帧具有不间断数据的最长系列,python-2.7,pandas,dataframe,Python 2.7,Pandas,Dataframe,我有一个像这样的数据框 A B C 0 1.232853 -1.979459 NaN 1 NaN 0.394940 1.068890 2 NaN 1.343977 NaN 3 2.125299 -0.649328 -0.211692 4 -0.187253 1.908618 -1.862934 5 2.243432 3.003434 NaN 我想为每一列找出最长的不间断数据序列。 对于A列,它是第3:5

我有一个像这样的数据框

      A         B         C
0  1.232853 -1.979459  NaN
1  NaN       0.394940  1.068890
2  NaN       1.343977  NaN
3  2.125299 -0.649328 -0.211692
4 -0.187253  1.908618 -1.862934
5  2.243432  3.003434 NaN  
我想为每一列找出最长的不间断数据序列。 对于A列,它是第3:5行,对于B 0:5和C 3,4行


此外,我如何在整个数据帧上获得相同的想法?在本例中,我将得到第3、4行。

您可以首先创建一个临时数据帧,其中每个不间断数据序列都标有(每列)唯一的编号。并将“原始”楠的背部放好,这样最长的系列就不能是楠的系列

dfseries = (df.notnull().shift(1) != df.notnull()).cumsum()
dfseries[df.isnull()] = np.nan

    A  B   C
0   1  1 NaN
1 NaN  1   2
2 NaN  1 NaN
3   3  1   4
4   3  1   4
5   3  1 NaN
要获得整个数据帧的最终结果,此时您可以添加:

dfseries = dfseries.dropna(axis=0, how='any')
如果然后执行GroupBy(每列)和累积计数,则该操作的最大值是最长序列的长度,
idxmax
将是该序列结束的位置

将两者放入一个新的数据框中:

dfrng = pd.concat((dfseries.apply(lambda x: x.groupby(x.values).cumcount().max()),
                   dfseries.apply(lambda x: x.groupby(x.values).cumcount().idxmax())),
                   axis=1, keys=['Length', 'EndPos'])
本系列的开头是:

dfrng['StartPos'] = dfrng.EndPos - dfrng.Length
由于
cumcount
从零开始,因此长度应增加1

dfrng['Length'] = dfrng.Length + 1
对于您的示例,其结果是:

dfrng.T

          A  B  C
Length    3  6  2
EndPos    5  5  4
StartPos  3  0  3