2 столбца с накоплением данных - PullRequest
2 голосов
/ 05 апреля 2019

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

+------+------------+
|  A   |     B      |
+------+------------+
| ID   | 1          |
| Date | 2019-04-04 |
| Name | Carl       |
| ID   | 2          |
| Date | 2019-04-05 |
| Name | Jane       |
+------+------------+

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

+----+------------+------+
| ID |    Date    | Name |
+----+------------+------+
|  1 | 2019-04-04 | Carl |
|  2 | 2019-04-05 | Jane |
+----+------------+------+

Я пытался транспонировать, pivot и unstack, но я действительно застрял.

Ответы [ 3 ]

4 голосов
/ 05 апреля 2019

Используя cumcount создайте ключ, затем pivot

df['C']=df.groupby('A').cumcount()
df.pivot(index='C',columns='A',values='B')
Out[118]: 
A        Date ID  Name
C                     
0  2019-04-04  1  Carl
1  2019-04-05  2  Jane
2 голосов
/ 05 апреля 2019

Я бы использовал словарь для сбора элементов, а затем использовал конструктор DataFrame.

d = {}

for a, b in zip(df.A, df.B):
    d.setdefault(a, []).append(b)

pd.DataFrame(d)

  ID        Date  Name
0  1  2019-04-04  Carl
1  2  2019-04-05  Jane

Вы также можете использовать defaultdict из библиотеки collections

from collections import defaultdict

d = defaultdict(list)

for a, b in zip(df.A, df.B):
    d[a].append(b)

pd.DataFrame(d)

  ID        Date  Name
0  1  2019-04-04  Carl
1  2  2019-04-05  Jane
2 голосов
/ 05 апреля 2019

Используйте GroupBy.cumcount с DataFrame.set_index и Series.unstack:

df = df.set_index([df.groupby('A').cumcount(), 'A'])['B'].unstack()
print (df)
A        Date ID  Name
0  2019-04-04  1  Carl
1  2019-04-05  2  Jane

Если важен порядок столбцов, добавьте:

df = (df.set_index([df.groupby('A').cumcount(), 'A'])['B']
        .unstack()
        .rename_axis(None, axis=1)
        .reindex(['ID','Date','Name'], axis=1))
print (df)
  ID        Date  Name
0  1  2019-04-04  Carl
1  2  2019-04-05  Jane
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...