我有一些包含以下列的csv数据:
country, region, year, month, price, volume
我需要将其转换为以下内容:
country, region, datapoints
数据点包含以下任何一项:
(year, month, price, volume)
元组数组,或(更好)
{
(year, month) : {price, volume}
}
实际上,我正在尝试将数据重塑为时间序列,然后可以将其存储为镶木地板。对于它的价值,我使用fastparquet将数据帧写入镶木地板文件。
这可能吗?
答案 0 :(得分:1)
您可以使用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)
编辑:好的我错过了groupby,无论如何,你可以先用键和项创建两列:
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
未被订购。