Как сжать или сложить информационный фрейм pandas вдоль строк? - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть большой массив данных pandas с несколькими столбцами, но давайте сосредоточимся на двух:

df = pd.DataFrame([['hey how are you', 'fine thanks',1], 
                    ['good to know', 'yes, and you',2],
                    ['I am fine','ok',3],
                    ['see you','bye!',4]],columns=list('ABC'))
df

Из:

    A                   B           C
0   hey how are you     fine thanks 1
1   good to know    yes, and you    2
2   I am fine             ok        3
3   see you             bye!        4

Из предыдущего фрейма данных, как я могу сжать два конкретных столбца в один фрейм данных pandas со значениями других столбцов? Например:

    A                C
0   hey how are you  1
1   fine thanks      1
2   good to know     2
3   yes, and you     2
4   I am fine        3
5   ok               3
6   see you          4
7   bye!             4

Я пытался:

df = df['A'].stack()
df = df.groupby(level=0)
df

Однако это не работает. Есть идеи, как добиться нового формата?

Ответы [ 3 ]

0 голосов
/ 11 ноября 2018

То, что вы можете искать, это pandas.concat.

Он принимает «последовательность или отображение объектов Series, DataFrame или Panel», поэтому вы можете передать list из ваших DataFrame объектов, выбирающих столбцы (которые будут pd.Series при индексации для одного столбца) ).

df3 = pd.concat([df['A'], df['B']])
0 голосов
/ 12 ноября 2018

Это удалит имена столбцов, но выполнит работу:

import pandas as pd

df = pd.DataFrame([['hey how are you', 'fine thanks'], 
                    ['good to know', 'yes, and you'],
                    ['I am fine','ok'],
                    ['see you','bye!']],columns=list('AB'))

df.stack().reset_index(drop=True)

0    hey how are you
1        fine thanks
2       good to know
3       yes, and you
4          I am fine
5                 ok
6            see you
7               bye!
dtype: object

Поведение стека по умолчанию сохраняет имена столбцов:

df.stack()

0  A    hey how are you
   B        fine thanks
1  A       good to know
   B       yes, and you
2  A          I am fine
   B                 ok
3  A            see you
   B               bye!
dtype: object

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

df[["A", "B"]].stack()

С дополнительными столбцами все становится сложнее, вам нужно выровнять индексы, опустив один уровень (содержащий столбцы):

df["C"] = range(4)

stacked = df[["A", "B"]].stack()
stacked.index = stacked.index.droplevel(level=1)

stacked

0    hey how are you
0        fine thanks
1       good to know
1       yes, and you
2          I am fine
2                 ok
3            see you
3               bye!
dtype: object

Теперь мы можем объединить с C столбец:

pd.concat([stacked, df["C"]], axis=1)

                 0  C
0  hey how are you  0
0      fine thanks  0
1     good to know  1
1     yes, and you  1
2        I am fine  2
2               ok  2
3          see you  3
3             bye!  3
0 голосов
/ 11 ноября 2018

Вы можете flatten() (или reshape(-1, )) value с DataFrame, которые хранятся в виде массива:

pd.DataFrame(df.values.flatten(), columns=['A'])

                 A
0  hey how are you
1      fine thanks
2     good to know
3     yes, and you
4        I am fine
5               ok
6          see you
7             bye!

Комментарии: Поведение по умолчанию np.ndarray.flatten и np.ndarray.reshape - это то, что вам нужно, это изменение индекса столбца быстрее, чем индекса строки в исходном массиве. Это так называемый мажорный ряд (в стиле C). Чтобы изменить индекс строки быстрее, чем индекс столбца, передайте order='F' для старшего столбца в стиле Fortran. Документы: https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.ndarray.flatten.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...