熊猫 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】:您可以对 slice
和 np.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 行的主要内容,如果未能解决你的问题,请参考以下文章