Настройка
df = pd.DataFrame({
'breakdowns': [[{u'key': u'platform', u'value': u'ios'}],
[{u'key': u'platform', u'value': u'android'}],
[{u'key': u'platform', u'value': u'ios'}],
[{u'key': u'platform', u'value': u'android'}]],
'metric': ['fb_ad_network_imp'] * 2 + ['fb_ad_network_request'] * 2,
'time': ['2018-08-29T07:00:00+0000'] * 4,
'value': [12, 32, 33, 132]
})
df['time'] = pd.DatetimeIndex(df['time'])
Решение
Предполагается, что столбец time
содержит временные метки, а затем использует метод доступа dt
, чтобы получить даты и назначить их новому столбцу в цепочке данных.
Я использовал лямбда-функцию для получения платформы из столбца разбивок, а затем сгруппировал эти значения вместе с датой и метрикой. Метрика не составляется, поэтому каждый столбец будет находиться в отдельных столбцах, индекс сбрасывается, а столбцы переименовываются в нужный формат.
result = (
df
.assign(date=df['time'].dt.date)
.groupby([df['breakdowns'].apply(lambda x: x[0].get('value')), 'date', 'metric'])
['value']
.sum()
.unstack('metric')
.reset_index()
.rename(columns={
'breakdowns': 'platform',
'fb_ad_network_request': 'clicks',
'fb_ad_network_imp': 'impressions'
})
)
result.columns.name = None
>>> result
platform date impressions clicks
0 android 2018-08-29 32 132
1 ios 2018-08-29 12 33