重塑/转型 pandas.Dataframe
Reshaping / Transforming pandas.Dataframe
你好,
我得到了以下 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]
})
我现在想要的是指定多个"dimensions"和多个"values",这样DataFrame
被重塑/转换,以便指定的尺寸和值彼此 "combined"。
未指定的值可能会消失,但指定的维度应保留在生成的 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}
...
]
我可以使用一些 pandas 魔法来做到这一点吗?
也许在 df.pivot?
的多个步骤中
亲切的问候
丹尼斯
第 1 部分:
1) 您可以设置以 dim 开头的列和 date 一起作为索引轴在整个操作期间保持静态.提供 append=True
以应对重复的索引。
2) unstack
所需级别。删除不需要的 val3
列并用 0 填充缺失值。
3) 通过在 multi-index 元组之间加入下划线来重命名列。
4) 重置与未堆叠相同的级别并另外对列名进行排序以匹配所需的输出。
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'}, ..........
你好,
我得到了以下 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]
})
我现在想要的是指定多个"dimensions"和多个"values",这样DataFrame 被重塑/转换,以便指定的尺寸和值彼此 "combined"。 未指定的值可能会消失,但指定的维度应保留在生成的 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}
...
]
我可以使用一些 pandas 魔法来做到这一点吗? 也许在 df.pivot?
的多个步骤中亲切的问候 丹尼斯
第 1 部分:
1) 您可以设置以 dim 开头的列和 date 一起作为索引轴在整个操作期间保持静态.提供 append=True
以应对重复的索引。
2) unstack
所需级别。删除不需要的 val3
列并用 0 填充缺失值。
3) 通过在 multi-index 元组之间加入下划线来重命名列。
4) 重置与未堆叠相同的级别并另外对列名进行排序以匹配所需的输出。
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'}, ..........