熊猫一次迭代多行重叠

ale*_*inn 3 python iteration pandas

我有一个 Pandas DataFrame,需要将其以 n 行的块形式输入下游函数(print在示例中)。块可能具有重叠的行。

让我们从一个虚拟的 DataFrame 开始:

d = {'A':list(range(1000)), 'B':list(range(1000))}
df=pd.DataFrame(d)
Run Code Online (Sandbox Code Playgroud)

在具有 1 行重叠的 2 行块的情况下,我有以下代码:

a = df.index.values[:-1]
for i in a:
    print(df.iloc[i:i+2])
Run Code Online (Sandbox Code Playgroud)

输出是这样的:

...
       A    B
996  996  996
997  997  997
       A    B
997  997  997
998  998  998
       A    B
998  998  998
999  999  999
Run Code Online (Sandbox Code Playgroud)

这正是我想要的。

是否有更好/更快的方法来迭代 pandas.DataFrame 的 n 行块?

jez*_*ael 6

DataFrame.groupby与使用相同长度创建的辅助 1d 数组一起使用整数除法,例如df- 索引值不重叠:

d = {'A':list(range(5)), 'B':list(range(5))}
df=pd.DataFrame(d)

print (np.arange(len(df)) // 2)
[0 0 1 1 2]

for i, g in df.groupby(np.arange(len(df)) // 2):
    print (g)

   A  B
0  0  0
1  1  1
   A  B
2  2  2
3  3  3
   A  B
4  4  4
Run Code Online (Sandbox Code Playgroud)

编辑:

对于重叠值编辑此答案

def chunker1(seq, size):
    return (seq.iloc[pos:pos + size] for pos in range(0, len(seq)-1))

for i in chunker1(df,2):
    print (i)

   A  B
0  0  0
1  1  1
   A  B
1  1  1
2  2  2
   A  B
2  2  2
3  3  3
   A  B
3  3  3
4  4  4
Run Code Online (Sandbox Code Playgroud)