我相信这里有必要将值重新整形为 3 列,列长度的唯一必要模数是 0:
print (len(df.columns) % 3)
0
df = pd.DataFrame(df.values.reshape(-1, 3),
columns=[f'c{x}' for x in range(1, 4)],
index = np.repeat(df.index, len(df.columns) / 3))
print (df)
c1 c2 c3
0 7 5 2
0 1 2 2
1 3 4 3
1 1 4 6
2 1 3 2
2 6 5 5
编辑:
我尝试模拟您的问题 - 添加新列 G 并在 3 列中获得输出:
print (df)
A B C D E F G
0 7 5 2 1 2 2 10
1 3 4 3 1 4 6 20
2 1 3 2 6 5 5 30
如果需要输出中的所有值,则添加来自末尾的值NaNs,因为不存在:
N = 3
c = np.arange(len(df.columns))
df.columns = [c % N, c // N]
df = df.stack().reset_index(drop=True)
df.columns = [f'{x + 1}' for x in df.columns]
print (df)
1 2 3
0 7 5.0 2.0
1 1 2.0 2.0
2 10 NaN NaN
3 3 4.0 3.0
4 1 4.0 6.0
5 20 NaN NaN
6 1 3.0 2.0
7 6 5.0 5.0
8 30 NaN NaN
另一个想法是删除通过索引创建 NaN 的列 - 这里是列 G:
N = 3
c = len(df.columns)
last = (c % N)
df = df.iloc[:, :-last]
print (df)
A B C D E F
0 7 5 2 1 2 2
1 3 4 3 1 4 6
2 1 3 2 6 5 5
然后使用原始解决方案:
df = pd.DataFrame(df.values.reshape(-1, 3),
columns=[f'c{x}' for x in range(1, 4)],
index = np.repeat(df.index, len(df.columns) / 3))
print (df)
c1 c2 c3
0 7 5 2
0 1 2 2
1 3 4 3
1 1 4 6
2 1 3 2
2 6 5 5