在 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
我在 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