作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类似的数据框
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 行。
最佳答案
您可以先制作一个临时 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
将是该系列的位置结束。
将两者放入一个新的 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
关于python-2.7 - Pandas 数据框最长系列,数据不间断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23514336/
我是一名优秀的程序员,十分优秀!