pandas dataframe最长系列,具有不间断的数据

时间:2014-05-07 09:48:02

标签: 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  

我想为每列找到最长的一系列不间断数据。 对于col A,它是行3:5,对于B 0:5和C 3,4。

此外,我如何在整个数据框架上获得相同的想法?在这种情况下,我会得到第3,4行。

1 个答案:

答案 0 :(得分:3)

您可以先创建一个临时DataFrame,其中每个系列的不间断数据都标有(每列)唯一编号。并将“原始”NaN放回原位,使最长的系列不能成为一系列NaN。

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

要在整个DataFrame上获得最终结果,此时您可以添加:

dfseries = dfseries.dropna(axis=0, how='any')

如果您随后执行GroupBy(每列)和每组的累计计数,则该操作的最大值是最长系列的长度,idxmax将是该系列结束的位置。< / p>

将两者放在一个新的DataFrame中:

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从零开始,因此长度应该增加一。

dfrng['Length'] = dfrng.Length + 1

您的示例结果如下:

dfrng.T

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