【问题标题】:Getting a dataframe from a pandas groupby to write to parquet从 pandas groupby 获取数据帧以写入镶木地板
【发布时间】:2018-11-10 08:25:06
【问题描述】:

我有一些包含以下列的 csv 数据:

country, region, year, month, price, volume

我需要将其转换为以下内容:

country, region, datapoints

其中数据点由以下任一组成: (year, month, price, volume) 元组数组,或(更好)

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

实际上,我正在尝试将数据重塑为时间序列,然后可以将其存储为镶木地板。对于它的价值,我正在使用 fastparquet 将数据帧写入 parquet 文件。

这可能吗?

【问题讨论】:

  • 只是一个观察,你写的更好的数据点格式不能在 Python 中工作,{year, month}set,它不能是字典中的键。你最终可以做(year, month) 这是tuble 并且可以是一个关键。
  • 谢谢...是的,键需要是(年,月)元组。

标签: python pandas pandas-groupby parquet fastparquet


【解决方案1】:

您可以使用apply 创建“数据点”列:

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)

然后您使用apply 执行groupby 并使用这两列执行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_indexrename 是为了得到预期的输出

注意:我建议对商品也使用tuple,而不是set,以防止出现任何订单问题,因为set没有被订购。

【讨论】:

  • 这看起来可以工作。但这似乎是逐行操作。我需要按国家、地区分组,然后为每个组执行此操作。
  • @ashic 对不起,我错过了标题中的 groupby,检查我的编辑,它对你有用
  • 太棒了...谢谢。我缺少的是 series.to_dict()。
猜你喜欢
  • 1970-01-01
  • 2020-03-23
  • 2018-12-22
  • 2021-03-26
  • 1970-01-01
  • 2019-04-24
  • 2020-06-30
  • 2020-04-02
  • 1970-01-01
相关资源
最近更新 更多