#python #pandas #dataframe #csv #pivot
#python #pandas #фрейм данных #csv #сводный
Вопрос:
У меня есть этот csv:
Label,Visits,Actions,Maximum actions in one visit,Total time spent by visitors (in seconds),Bounces,Visits with Conversions,Unique visitors (daily sum),Users (daily sum),Metadata: segment,Metadata: referrer_type, cmpgn_group2, cmpgn_group3
Search Engines,4386,5836,15,351989,3547,0,4098,0,referrerType==search,2, name_1, 08-09
Campaigns,2618,3007,20,68609,2385,0,2579,0,referrerType==campaign,6, name_1, 08-09
Direct Entry,2266,3056,21,211456,1833,0,1943,0,referrerType==direct,1, name_1, 08-09
Websites,1097,2002,15,149385,722,0,987,0,referrerType==website,3, name_1, 08-09
Social Networks,691,787,8,18003,623,0,655,0,referrerType==social,7, name_1, 08-09
Search Engines,4045,10889,78,454772,2124,0,3860,0,referrerType==search,2, name_2, 08-09
Direct Entry,1046,3246,111,127677,572,0,943,0,referrerType==direct,1, name_2, 08-09
Websites,139,498,43,21249,61,0,133,0,referrerType==website,3, name_2, 08-09
Social Networks,81,176,16,6667,54,0,77,0,referrerType==social,7, name_2, 08-09
Direct Entry,6752,20806,60,994228,2994,0,5956,0,referrerType==direct,1, name_3, 08-09
Search Engines,3266,14436,50,920652,805,0,2982,0,referrerType==search,2, name_3, 08-09
Websites,250,1413,30,87955,51,0,233,0,referrerType==website,3, name_3, 08-09
Campaigns,27,165,28,8428,3,0,27,0,referrerType==campaign,6, name_3, 08-09
Social Networks,12,31,11,3900,4,0,12,0,referrerType==social,7, name_3, 08-09
Что я хочу сделать, так это объединить (суммировать) Visits
столбец с Label
as columns и cmpgn_group2
as rows, чтобы конечный результат выглядел так:
cmpgn_group2,Campaigns,Direct Entry,Search Engines,Social Networks,Websites
name_1,2618.0,2266.0,4386.0,691.0,1097.0
name_2,,1046.0,4045.0,81.0,139.0
name_3,27.0,6752.0,3266.0,12.0,250.0
Однако, когда я просто печатаю свой фрейм данных, я получаю это:
Visits
Label Campaigns Direct Entry Search Engines Social Networks Websites
cmpgn_group2
name_1 2618.0 2266.0 4386.0 691.0 1097.0
name_2 NaN 1046.0 4045.0 81.0 139.0
name_3 27.0 6752.0 3266.0 12.0 250.0
Что хорошо для удобства чтения в моем ноутбуке Jupyter, однако, когда я использую эту to_csv()
функцию, я хотел бы иметь правильный csv (похожий на тот, который я показал выше), к сожалению, я получаю следующее:
,Visits,Visits,Visits,Visits,Visits
Label,Campaigns,Direct Entry,Search Engines,Social Networks,Websites
cmpgn_group2,,,,,
name_1,2618.0,2266.0,4386.0,691.0,1097.0
name_2,,1046.0,4045.0,81.0,139.0
name_3,27.0,6752.0,3266.0,12.0,250.0
С моей точки зрения, это неправильный csv, и я не могу использовать его в своем рабочем процессе.
Это мой код:
df = pd.read_csv('channels_26_Oct_2020.csv')
df2 = pd.pivot_table(df, values=['Visits'], columns=['Label'], index=' cmpgn_group2', aggfunc=np.sum)
print(df2)
df2.to_csv('channels_26_Oct_2020_2.csv')
Каков правильный подход к этому? Как я могу создать правильный csv?
Большое вам спасибо
Ответ №1:
Причина pivot_table
в том, что создает многоиндексные фреймы данных. Вы можете свернуть их в один индекс следующим образом:
df2 = pd.pivot_table(df, values=['Visits'], columns=['Label'], index=' cmpgn_group2', aggfunc=np.sum)
df2.columns = df2.columns.map('_'.join)
df2.to_csv('ex1.csv')
Выходной файл CSV:
cmpgn_group2,Visits_Campaigns,Visits_Direct Entry,Visits_Search Engines,Visits_Social Networks,Visits_Websites
name_1,2618.0,2266.0,4386.0,691.0,1097.0
name_2,,1046.0,4045.0,81.0,139.0
name_3,27.0,6752.0,3266.0,12.0,250.0
Комментарии:
1. Спасибо! Я не знал, что map () существует в pandas (сейчас чувствую себя немного неловко), я буду экспериментировать с ним. Работает ли это также для нескольких индексов?
2.
df2.columns
выглядит так:MultiIndex([('Visits', 'Campaigns'), ('Visits', 'Direct Entry'), ('Visits', 'Search Engines'), ('Visits', 'Social Networks'), ('Visits', 'Websites')], names=[None, 'Label'])
Вот почему мы можем использоватьmap
для объединения is в один3. Хорошо, теперь я понимаю, но это работает, только если все столбцы являются строками из моих экспериментов, если я соединяю строки и целые числа, я должен использовать что-то немного другое. В любом случае, большое вам спасибо.