Я считаю, что здесь необходимо изменить значения до 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
EDIT:
Я пытаюсь смоделировать вашу проблему - добавил новый столбец 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
Если нужны все значения в выводе, то для значений от конца добавляются NaN
s, потому что не существует:
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