Как перенастроить фрейм данных панд? - PullRequest
1 голос
/ 17 мая 2019

Я пытаюсь перенастроить фрейм данных pandas, который в настоящее время выглядит следующим образом:

   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

примерно так:

   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

(пытаюсь разделить фрейм данных, а затемпоместите последний срез внизу как новую строку - c1, c2, c3 - новые метки столбцов)

Ответы [ 2 ]

2 голосов
/ 17 мая 2019

Я считаю, что здесь необходимо изменить значения до 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
0 голосов
/ 17 мая 2019

Если количество столбцов делится на 3 и вам нужны уникальные имена индексов:

import numpy as np
import pandas as pd

df = pd.DataFrame({'A': [7.0, 3.0, 1.0],
          'B': [5.0, 4.0, 3.0],
          'C': [2.0, 3.0, 2.0],
          'D': [1.0, 1.0, 6.0],
          'E': [2.0, 4.0, 5.0],
          'F': [2.0, 6.0, 5.0]})

df1 = pd.DataFrame(df.to_numpy().reshape(-1,3), columns = ['c1','c2','c3'])

print(df1)

    c1   c2   c3
0  7.0  5.0  2.0
1  1.0  2.0  2.0
2  3.0  4.0  3.0
3  1.0  4.0  6.0
4  1.0  3.0  2.0
5  6.0  5.0  5.0
...