Pandas изменить форму столбцов - PullRequest
1 голос
/ 21 января 2020

Я хочу изменить pandas фрейм данных,

У меня есть CSV-файл в этом формате

#Result;ID;Date;Events;type
12;1240422;10/01/2017 10:10;1;Item1
2;1241468;12/01/2017 09:15;0;Item1
7.8;1241469;12/01/2017 09:40;0;Item1
151;1241470;12/01/2017 10:00;1;Item1
0;1241471;12/01/2017 10:20;0;Item1
3;1241472;12/01/2017 10:40;0;Item1
0;1241473;12/01/2017 11:10;0;Item1
164;1240422;10/01/2017 10:10;1;Item2
162;1241468;12/01/2017 09:15;0;Item2
161;1241469;12/01/2017 09:40;0;Item2
161;1241470;12/01/2017 10:00;1;Item2
162;1241471;12/01/2017 10:20;0;Item2
349;1241472;12/01/2017 10:40;0;Item2
162;1241473;12/01/2017 11:10;0;Item2
7.8;1240422;10/01/2017 10:10;1;Item3
7.8;1241468;12/01/2017 09:15;0;Item3
7.8;1241469;12/01/2017 09:40;0;Item3
7.8;1241470;12/01/2017 10:00;1;Item3
7.9;1241471;12/01/2017 10:20;0;Item3
7.7;1241472;12/01/2017 10:40;0;Item3
7.8;1241473;12/01/2017 11:10;0;Item3
0;1240422;10/01/2017 10:10;1;Item4
0;1241468;12/01/2017 09:15;0;Item4
0;1241469;12/01/2017 09:40;0;Item4
0;1241470;12/01/2017 10:00;1;Item4
0;1241471;12/01/2017 10:20;0;Item4
0.17;1241472;12/01/2017 10:40;0;Item4
0;1241473;12/01/2017 11:10;0;Item4

Мне нужно что-то вроде ниже (они в основном сгруппированы по id, если хотя бы одно из событий равно 1, тогда это будет 1)

Item1;Item2;Item3;Item4;Events;Date;ID
12;164;7.8;0;1;10/01/2017 10:10;1240422
2;162;7.8;0;0;12/01/2017 09:15;1241468
7.8;161;7.8;0;0;12/01/2017 09:40;1241469
151;161;7.8;0;1;12/01/2017 10:00;1241470
0;162;7.9;0;0;12/01/2017 10:20;1241471
3;349;7.7;0.17;0;12/01/2017 10:40;1241472
0;162;7.8;0;0;12/01/2017 11:10;1241473

Есть предложения? Спасибо

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Позвольте использовать изменение формы данных:

import pandas as pd
from io import StringIO

csvtxt = StringIO("""Result;ID;Date;Events;type
12;1240422;10/01/2017 10:10;1;Item1
2;1241468;12/01/2017 09:15;0;Item1
7.8;1241469;12/01/2017 09:40;0;Item1
151;1241470;12/01/2017 10:00;1;Item1
0;1241471;12/01/2017 10:20;0;Item1
3;1241472;12/01/2017 10:40;0;Item1
0;1241473;12/01/2017 11:10;0;Item1
164;1240422;10/01/2017 10:10;1;Item2
162;1241468;12/01/2017 09:15;0;Item2
161;1241469;12/01/2017 09:40;0;Item2
161;1241470;12/01/2017 10:00;1;Item2
162;1241471;12/01/2017 10:20;0;Item2
349;1241472;12/01/2017 10:40;0;Item2
162;1241473;12/01/2017 11:10;0;Item2
7.8;1240422;10/01/2017 10:10;1;Item3
7.8;1241468;12/01/2017 09:15;0;Item3
7.8;1241469;12/01/2017 09:40;0;Item3
7.8;1241470;12/01/2017 10:00;1;Item3
7.9;1241471;12/01/2017 10:20;0;Item3
7.7;1241472;12/01/2017 10:40;0;Item3
7.8;1241473;12/01/2017 11:10;0;Item3
0;1240422;10/01/2017 10:10;1;Item4
0;1241468;12/01/2017 09:15;0;Item4
0;1241469;12/01/2017 09:40;0;Item4
0;1241470;12/01/2017 10:00;1;Item4
0;1241471;12/01/2017 10:20;0;Item4
0.17;1241472;12/01/2017 10:40;0;Item4
0;1241473;12/01/2017 11:10;0;Item4""")

df = pd.read_csv(csvtxt, sep=';')
df_out = df.set_index(['ID','Date','Events','type'])['Result'].unstack().reset_index()
df_out.to_csv('out.csv', sep=';', index=False)
!type out.csv

Вывод в файл 'out.csv':

ID;Date;Events;Item1;Item2;Item3;Item4
1240422;10/01/2017 10:10;1;12.0;164.0;7.8;0.0
1241468;12/01/2017 09:15;0;2.0;162.0;7.8;0.0
1241469;12/01/2017 09:40;0;7.8;161.0;7.8;0.0
1241470;12/01/2017 10:00;1;151.0;161.0;7.8;0.0
1241471;12/01/2017 10:20;0;0.0;162.0;7.9;0.0
1241472;12/01/2017 10:40;0;3.0;349.0;7.7;0.17
1241473;12/01/2017 11:10;0;0.0;162.0;7.8;0.0
0 голосов
/ 21 января 2020
df.set_index('ID')\
  .join(df.pivot(index = 'ID', columns = 'type', values = 'Result'))\
  .reset_index()\
  .drop(columns  = 'type')

Я совершенно запутался, откуда берутся многие значения в столбцах элементов, но я собираюсь предположить, что у вас просто намного больше данных. Это создает новые столбцы для элементов и устанавливает значения, равные значениям в столбце «Результат».

...