熊猫 iloc 复杂切片每 n 行

Posted

技术标签:

【中文标题】熊猫 iloc 复杂切片每 n 行【英文标题】:Pandas iloc complex slice every nth row 【发布时间】:2019-01-24 15:01:11 【问题描述】:

我有一个周期性为 14 行的数据框,即每条记录有 14 行数据(平均值、sdev 等),我想为每条记录重复提取第 2、4、7 和 9 行(14 行)。我的代码是:

Mean_df = df.iloc[[1,3,6,8]::14,:].copy()

这不起作用

TypeError: cannot do slice indexing on <class 'pandas.core.indexes.range.RangeIndex'> with these indexers [[1, 3, 6, 8]] of <class 'list'>

我从这里获得了代码方面的帮助,这很有用,但在多行选择上却没有—— Pandas every nth row

我可以提取几个不同的切片并组合,但感觉可能有更优雅的解决方案。

有什么想法吗?

【问题讨论】:

【参考方案1】:

使用:

df[np.isin(np.arange(len(df))%14,np.array([1,3,6,8]))]

【讨论】:

干杯,它做得很好,将来绝对会再次使用它。【参考方案2】:

您可以对 slicenp.r_ 使用元组推导:

arr = np.arange(14*3)
slices = tuple(slice(i, len(arr), 14) for i in (1, 3, 6, 8))

res = np.r_[slices]

print(res)

array([ 1, 15, 29,  3, 17, 31,  6, 20, 34,  8, 22, 36])

在此示例中,使用 1::14 索引数据帧行等效于使用 slice(1, df.shape[0], 14) 索引。

这是相当通用的,您可以定义切片对象的任何元组并传递给np.r_

【讨论】:

谢谢!这很适合提供索引 - 用作 df.iloc[res,:] 工作得非常好,并且列表组合非常 Pythonic。我不知道它是否像温的回答一样可读/优雅。 @DrBAC,就其价值而言,我认为 Wen 的解决方案更适合您的具体示例。虽然我的解决方案更通用。

以上是关于熊猫 iloc 复杂切片每 n 行的主要内容,如果未能解决你的问题,请参考以下文章

取熊猫系列中每 N 行的总和

在有条件的熊猫中除以前一行

熊猫 iloc 返回与 loc 不同的范围 [重复]

获取熊猫中NaN值的所有行和列位置[重复]

对于带有 csv 列的循环(熊猫)

大熊猫中的“iloc”和“loc”是啥?