【问题标题】:Reshaping / Transforming pandas.Dataframe重塑/转换 pandas.Dataframe
【发布时间】:2017-01-20 11:25:57
【问题描述】:

嘿嘿,

我有以下 pandas.DataFrame

df = pandas.DataFrame({
  "date": ["2016-12-11", "2016-12-12", "2016-12-13", "2016-12-14", "2016-12-15"], 
  "dim1": ["dim11", "dim12", "dim12", "dim11", "dim13"],
  "dim2": ["dim22", "dim21", "dim21", "dim22", "dim23"],
  "dim3": ["dim31", "dim32", "dim32", "dim31", "dim33"],
  "val1": [1, 2, 3, 4, 5],
  "val2": [6, 7, 8, 9, 10],
  "val3": [11,12,13,14,15]
  })

我现在想要的是指定多个“维度”和多个“值”,以便 DataFrame 被重新整形/转换,以便指定的尺寸和值相互“组合”。 未指定的值可能会消失,但指定的维度应保留在生成的 DataFrame 中。

为了清楚说明生成的 DataFrame 的简单示例。 指定尺寸为:dim1、dim2 指定值为:val1, val2

df_res = pandas.DataFrame({
  "date": ["2016-12-11", "2016-12-12", "2016-12-13", "2016-12-14", "2016-12-15"],
  "dim3": ["dim31", "dim32", "dim32", "dim31", "dim33"],
  "dim11_dim22_val1": [1, 0, 0, 4, 0],
  "dim12_dim21_val1": [0, 2, 3, 0, 0],
  "dim13_dim23_val1": [0, 0, 0, 0, 5],
  "dim11_dim22_val2": [6, 0, 0, 9, 0],
  "dim12_dim21_val2": [0, 7, 8, 0, 0],
  "dim13_dim23_val2": [0, 0, 0, 0, 10]
})

所以基本上有dim1、dim2、val1和val2的多种组合。 val3 从结果中下降,但维度 date_id 和 dim3 保留在那里。

附带说明:之后我会做一个 df_res.to_dict(orient="records"),它应该输出

[
  {"date_id": "2016-12-11", "dim3": "dim31", "dim11_dim22_val1": 1, "dim12_dim21_val1": 0, "dim13_dim23_val1": 0, "dim11_dim22_val2": 6, "dim12_dim21_val2": 0, "dim13_dim23_val2": 0}
  ...
]

我可以用一些熊猫魔法来做到这一点吗? 也许在 df.pivot 的多个步骤中?

亲切的问候 丹尼斯

【问题讨论】:

  • 两个问题太多了:)

标签: python-3.x pandas reshape


【解决方案1】:

第 1 部分:

1) 您可以设置以 dim 开头的列以及 date 在整个操作期间将保持静态作为索引轴。提供append=True 以面对重复的索引。

2) unstack 所需的级别。删除不需要的 val3 列并用 0 填充缺失值。

3) 通过在多索引元组之间加入下划线来重命名列。

4) 重置与 unstacked 相同的级别,并另外对列名进行排序以匹配所需的输出。


df.set_index(df.filter(like='dim').columns.tolist()+['date'], append=True, inplace=True)
df = df.unstack(level=[2,1]).drop('val3', axis=1).fillna(0).astype(int)
df.columns = ['_'.join(c[::-1]) for c in df.columns]
df_res = df.reset_index(level=[2,1]).sort_index(axis=1)
df_res


第 2 部分:

df_res.to_dict('r')

产生:

[{'date': '2016-12-11',
  'dim11_dim22_val1': 1,
  'dim11_dim22_val2': 6,
  'dim12_dim21_val1': 0,
  'dim12_dim21_val2': 0,
  'dim13_dim23_val1': 0,
  'dim13_dim23_val2': 0,
  'dim3': 'dim31'}, ..........

【讨论】:

  • 这很有帮助。谢谢!
猜你喜欢
  • 2016-04-12
  • 2014-08-11
  • 2020-07-06
  • 2020-07-17
  • 2021-11-03
  • 2016-01-21
  • 2021-08-01
  • 2019-02-13
  • 2019-01-09
相关资源
最近更新 更多