Получение данных из группы панд для записи в паркет - PullRequest
0 голосов
/ 31 мая 2018

У меня есть некоторые данные CSV со следующими столбцами:

country, region, year, month, price, volume

Мне нужно преобразовать это в нечто вроде следующего:

country, region, datapoints

Где точки данных состоят из: (year, month, price, volume) массива кортежей, ИЛИ (лучше)

{ (year, month) : {price, volume} }

По сути, я пытаюсь преобразовать данные в серию времени, котораязатем можно хранить как паркет.Что бы это ни стоило, я использую fastparquet для записи фреймов данных в файлы паркета.

Возможно ли это?

1 Ответ

0 голосов
/ 31 мая 2018

Вы можете использовать apply для создания столбца 'datapoint':

df['datapoint'] = df.apply(lambda row: (row['year'],row['month'],
                                         row['price'],row['volume']),1)

или

df['datapoint_better'] = df.apply(lambda row: {(row['year'],row['month']):
                                                 {row['price'],row['volume']}},1)

Как я уже сказал, вы не можете сделать {row['year'],row['month']} каквведите словарь

И затем, если вы хотите просмотреть столбцы:

df = df.drop(['year','month','price','volume'],1)

РЕДАКТИРОВАТЬ: хорошо, я пропустил группу, в любом случае, вы можете сначала создать два столбца с ключами иitem:

df['key'] = df.apply(lambda row: ( row['year'], row['month']),1)
df['item'] = df.apply(lambda row: { row['price'], row['volume']},1)

и затем вы делаете groupby с apply и pd.Series.to_dict с этими двумя столбцами, такими как:

df_output = (df.groupby(['country','region'])
               .apply(lambda df_grouped: pd.Series(df_grouped.item.values,
                                                   index=df_grouped.key).to_dict())
               .reset_index().rename(columns={0:'datapoints'}))

reset_index и rename - для получения ожидаемого результата

Примечание: я бы предложил использовать tuple также для элемента, а не set, чтобы предотвратить любые проблемы с заказом, так как set не заказан.

...