在 pandas 中切片 DataFrame?

Slicing a DataFrame in pandas?

我在 pandas 中遇到 df 问题。假设我有这个数据框:

k = [1,2,3,4,5,6,7,8,9,10,11,12]

k = pd.DataFrame(k).T

这是一个 1x12 数据框,我想得到一个包含 4 列的 df,比如 k4:

k1 = pd.DataFrame([1,2,3,4])
k2 = pd.DataFrame( [5,6,7,8])
k3 =  pd.DataFrame([9,10,11,12])
frames = [k1,k2,k3]
k4 = pd.concat(frames, axis = 1).T

我原来的 df 比 k 大很多但是它的列数是 4 的倍数 我想把它切成 4 列 df。我想这可能是什么 与 i%4 == 0 有关,但我真的不知道该怎么做。

提前致谢。

我漏掉了一个问题。我应该换位k4。抱歉各位。

总而言之,我有一个大行,其 len 倍数是 4,比 12 大得多:

    0   1   2   3   4   5   6   7   8   9   10  11
0   1   2   3   4   5   6   7   8   9  10  11  12

我需要制作一个包含 4 列的 df,每 4 个元素改变行:

  0   1   2   3
0  1   2   3   4
0  5   6   7   8
0  9  10  11  12

您可以先通过 floor divide 和模数在列中创建 MultiIndex,然后使用 stack, for remove first level of MultiIndex of index add reset_index:

k = [1,2,3,4,5,6,7,8,9,10,11,12]

k = pd.DataFrame(k).T
k.columns = [k.columns // 4, k.columns % 4]
print (k)
   0           1           2            
   0  1  2  3  0  1  2  3  0   1   2   3
0  1  2  3  4  5  6  7  8  9  10  11  12

print (k.stack().reset_index(level=0, drop=True))
   0  1   2
0  1  5   9
1  2  6  10
2  3  7  11
3  4  8  12

编辑:

只需要 0 交换 MultiIndex 的第一层,而不是默认的最后一层

print (k.stack(0).reset_index(level=0, drop=True))
   0   1   2   3
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

或将模数与楼层划分交换:

k = [1,2,3,4,5,6,7,8,9,10,11,12]

k = pd.DataFrame(k).T
k.columns = [k.columns % 4, k.columns // 4]
print (k)
   0  1  2  3  0  1  2  3  0   1   2   3
   0  0  0  0  1  1  1  1  2   2   2   2
0  1  2  3  4  5  6  7  8  9  10  11  12

print (k.stack().reset_index(level=0, drop=True))
   0   1   2   3
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12

另一个 numpy.ndarray.reshape 的 numpy 解决方案更快:

k = [1,2,3,4,5,6,7,8,9,10,11,12]

print (pd.DataFrame(np.array(k).reshape(-1,4)))
   0   1   2   3
0  1   2   3   4
1  5   6   7   8
2  9  10  11  12