Как сгладить определенный диапазон столбцов в один в python? - PullRequest
4 голосов
/ 18 марта 2020

У меня есть таблица данных с размером 214 строк и 972 столбца .

Я хочу взять каждые 108 столбцов, а затем сплющить в один столбец.

Тогда выходная таблица будет иметь размерность 23112 (= 214 * 108) строк и 9 столбцов.

Я пробовал pd.concat и pd.flatten что-то et c. ,,,, но я могу только сгладить целые столбцы таблицы в один столбец.

Итак, чтобы быть простым, ниже игрушечный стол. Подберите каждые два столбца и сведите их в один столбец. поэтому я хочу измениться; [5 * 6] - [10 * 3]

a  b  c  d  e  f 
g  h  i  j  k  l
m  n  o  p  q  r 
s  t  u  v  w  x
y  z  1  2  3  4 

Это будет преобразовано в

a  c  e
g  i  k
m  o  q
s  u  w
y  1  3
b  d  f
h  j  l
n  p  r
t  v  x
z  2  4

Я действительно новичок в python ,, слишком трудно понять это, спасибо за вашу помощь!

Ответы [ 4 ]

2 голосов
/ 18 марта 2020

Вы также можете использовать, np.reshape:

n = 2 #replace n with your factor
pd.DataFrame(np.reshape(df.to_numpy().T,(df.shape[1]//n,df.shape[0]*n)).T)

Или даже без изменения формы, используя Фортраноподобный индексный порядок

pd.DataFrame(np.reshape(df.to_numpy(),(df.shape[0]*n,df.shape[1]//n),order='F'))

   0  1  2
0  a  c  e
1  g  i  k
2  m  o  q
3  s  u  w
4  y  1  3
5  b  d  f
6  h  j  l
7  n  p  r
8  t  v  x
9  z  2  4
2 голосов
/ 18 марта 2020

IIU C:

print (pd.concat([pd.DataFrame(df.iloc[:,::2].values),
                  pd.DataFrame(df.iloc[:,1::2].values)])
       .reset_index(drop=True))

Или обобщить с использованием списка со значением n:

n=2
print (pd.concat([pd.DataFrame(df.iloc[:,i::n].values) for i in range(n)])
       .reset_index(drop=True))

   0  1  2
0  a  c  e
1  g  i  k
2  m  o  q
3  s  u  w
4  y  1  3
5  b  d  f
6  h  j  l
7  n  p  r
8  t  v  x
9  z  2  4
1 голос
/ 18 марта 2020

Вот как бы я это сделал, прежде чем прочесть ответы других людей на ваш вопрос:

import pandas as pd


def concat_every(frame, every):
    frame = frame.copy()
    new_df = pd.DataFrame(
        columns=range(len(frame.columns)//every)
    )
    for c in new_df.columns:
        col = frame.columns
        new_df[c] = pd.concat(
            [frame.pop(col[i]) for i in range(every)],
            ignore_index=True
        )
    return new_df


df = pd.DataFrame({
    0:['a','g','m','s','y'],
    1:['b','h','n','t','z'],
    2:['c','i','o','u',1],
    3:['d','j','p','v',2],
    4:['e','k','q','w',3],
    5:['f','l','r','x',4],
})

df1 = concat_every(df, 2)

print(df)
print(df1)

Python Tutor Ссылка на код

1 голос
/ 18 марта 2020

Используя списки, можно сделать в одну строку:

cols_to_flatten = 2 #change this as per your requirement
pd.concat([pd.concat([df[col] for col in df.columns[i:i+cols_to_flatten]], ignore_index=True) for i in range(0, df.shape[1], cols_to_flatten)], axis=1)
...