Поведение панд в стеке - PullRequest
0 голосов
/ 21 мая 2018

Предположим, у меня есть

ID A1 B1  A2  B2
1  3  4   5   6
2  7  8   9   10

Я хочу использовать стек панд и хочу достичь чего-то подобного

ID A B
1  3 4
1  5 6
2  7 8
2  9 10

, но я получил

ID  A   B
1   3   4
2   7   8
1   5   6
2   9   10

это то, что я использую

df.stack().reset_index().

Возможно ли достичь чего-то подобного с помощью стека?append() метод в пандах делает это, но если возможно, я хочу добиться с помощью pandas stack() Есть идеи?

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Вы можете использовать pd.wide_to_long:

pd.wide_to_long(df, ['A','B'], 'ID', 'value', sep='', suffix='.+')\
  .reset_index()\
  .sort_values('ID')\
  .drop('value', axis=1)

Выход:

   ID  A   B
0   1  3   4
2   1  5   6
1   2  7   8
3   2  9  10
0 голосов
/ 21 мая 2018

Более интересный способ

s.groupby(s.columns.str[0],axis=1).agg(lambda x : x.values.tolist()).stack().apply(pd.Series).unstack(0).T.reset_index(level=0,drop=True)
Out[90]: 
    A   B
ID       
1   3   4
2   7   8
1   5   6
2   9  10
0 голосов
/ 21 мая 2018

Создайте новый объект columns, разделив имена существующих столбцов.Это само собой разумеющееся, что у нас есть однозначные буквы, за которыми следует одна цифра.

d = df.set_index('ID')
d.columns = d.columns.map(tuple)
d.stack().reset_index('ID')

   ID  A   B
1   1  3   4
2   1  5   6
1   2  7   8
2   2  9  10

Одна строка

df.set_index('ID').rename(columns=tuple).stack().reset_index('ID')

Более обобщенно

d = df.set_index('ID')
s = d.columns.str
d.columns = [
    s.extract('^(\D+)', expand=False),
    s.extract('(\d+)$', expand=False)
]
d.stack().reset_index('ID')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...