Python3.9 pandas сохраняет сводный фрейм данных как правильный csv

#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. Хорошо, теперь я понимаю, но это работает, только если все столбцы являются строками из моих экспериментов, если я соединяю строки и целые числа, я должен использовать что-то немного другое. В любом случае, большое вам спасибо.