将 MultiIndex DataFrames 与列 headers 连接起来
Concatenate MultiIndex DataFrames with column headers
我正在将几个 Pandas DataFrame 连接成一个大 DataFrame,以将结果打印到 CSV 文件中。
我通过 multi-period 计算 horizon 报告了几个细分市场(例如 0 到 3)。每个段都有几个与之关联的数据帧(例如 df1 和 df2)。
为了简单起见,这里只假设一个段(每个不同的段都有一个特定的键或场景键)。
除了将列名称打印到 CSV 之外,一切正常。
我试过 pd.concat(..., names = " ... ")
- 但那不起作用。唯一打印到 headers 的是不同的日期。
具体来说,我想将 "Full Key"、"Scenario" 和 "Metric" 打印到 CSV 的 headers 列(在第 0、1 和 2 列中)并继续打印句点(在第 3 列到第 6 列中)。
在 Pandas 中有没有简单的方法可以做到这一点?
例子
import pandas as pd
import numpy as np
dates = [0, 1, 3, 3]
labels1 = ["A", "B", "C"]
labels2 = ["X", "Y", "Z"]
rand1 = np.random.rand(3,4)
rand2 = np.random.rand(3,4)
df1 = pd.DataFrame(rand1, columns=dates, index=labels1)
df2 = pd.DataFrame(rand2, columns=dates, index=labels2)
# Differs for each segment (note: just one segment assumed here for simplification)
key = "rand_key"
scenario = "scenario"
df_con = pd.concat([df1, df2], keys=pd.MultiIndex.from_product(
[[key], [scenario], ["Data Frame 1", "Data Frame 2"]],
names=['Full Key', 'Scenario', 'Metric']))
print(df_con)
输出
0 1 3 3
rand_key scenario Data Frame 1 A 0.381607 0.251023 0.225814 0.221244
B 0.829346 0.148782 0.601416 0.410067
C 0.785393 0.792234 0.012604 0.476273
Data Frame 2 X 0.960281 0.563819 0.286736 0.530170
Y 0.829257 0.986729 0.790758 0.013667
Z 0.287239 0.796072 0.576769 0.694845
您可以在 concat
, not in MultiIndex.from_product
:
中使用参数 names
df_con = pd.concat([df1, df2],
keys=pd.MultiIndex.from_product(
[[key], [scenario], ["Data Frame 1", "Data Frame 2"]]),
names=["Full Key", "Scenario","Metric", 'val'])
print(df_con)
0 1 3 3
Full Key Scenario Metric val
rand_key scenario Data Frame 1 A 0.824102 0.525212 0.386341 0.590881
B 0.137524 0.808270 0.965826 0.779796
C 0.239335 0.867260 0.808115 0.063681
Data Frame 2 X 0.231228 0.589685 0.137487 0.678441
Y 0.992191 0.285752 0.760913 0.046527
Z 0.332536 0.944553 0.636517 0.601849
如果需要删除级别 val
:
df_con = df_con.reset_index(level='val', drop=True)
print (df_con)
0 1 3 3
Full Key Scenario Metric
rand_key scenario Data Frame 1 0.686811 0.726811 0.479694 0.367657
Data Frame 1 0.839970 0.454164 0.321366 0.092720
Data Frame 1 0.060438 0.090951 0.682706 0.680736
Data Frame 2 0.243174 0.640461 0.069139 0.872920
Data Frame 2 0.109607 0.169056 0.467378 0.775949
Data Frame 2 0.854445 0.210386 0.076642 0.788915
最后写入 csv
:
df_con.to_csv('file.csv')
另一个解决方案是设置索引名称:
df_con.index.names = ["Full Key", "Scenario","Metric", 'val']
df_con.to_csv('file.csv')
最后一个解是rename_axis
:
df_con.rename_axis(["Full Key", "Scenario","Metric", 'val']).to_csv('file.csv')
我正在将几个 Pandas DataFrame 连接成一个大 DataFrame,以将结果打印到 CSV 文件中。
我通过 multi-period 计算 horizon 报告了几个细分市场(例如 0 到 3)。每个段都有几个与之关联的数据帧(例如 df1 和 df2)。 为了简单起见,这里只假设一个段(每个不同的段都有一个特定的键或场景键)。
除了将列名称打印到 CSV 之外,一切正常。
我试过 pd.concat(..., names = " ... ")
- 但那不起作用。唯一打印到 headers 的是不同的日期。
具体来说,我想将 "Full Key"、"Scenario" 和 "Metric" 打印到 CSV 的 headers 列(在第 0、1 和 2 列中)并继续打印句点(在第 3 列到第 6 列中)。
在 Pandas 中有没有简单的方法可以做到这一点?
例子
import pandas as pd
import numpy as np
dates = [0, 1, 3, 3]
labels1 = ["A", "B", "C"]
labels2 = ["X", "Y", "Z"]
rand1 = np.random.rand(3,4)
rand2 = np.random.rand(3,4)
df1 = pd.DataFrame(rand1, columns=dates, index=labels1)
df2 = pd.DataFrame(rand2, columns=dates, index=labels2)
# Differs for each segment (note: just one segment assumed here for simplification)
key = "rand_key"
scenario = "scenario"
df_con = pd.concat([df1, df2], keys=pd.MultiIndex.from_product(
[[key], [scenario], ["Data Frame 1", "Data Frame 2"]],
names=['Full Key', 'Scenario', 'Metric']))
print(df_con)
输出
0 1 3 3
rand_key scenario Data Frame 1 A 0.381607 0.251023 0.225814 0.221244
B 0.829346 0.148782 0.601416 0.410067
C 0.785393 0.792234 0.012604 0.476273
Data Frame 2 X 0.960281 0.563819 0.286736 0.530170
Y 0.829257 0.986729 0.790758 0.013667
Z 0.287239 0.796072 0.576769 0.694845
您可以在 concat
, not in MultiIndex.from_product
:
names
df_con = pd.concat([df1, df2],
keys=pd.MultiIndex.from_product(
[[key], [scenario], ["Data Frame 1", "Data Frame 2"]]),
names=["Full Key", "Scenario","Metric", 'val'])
print(df_con)
0 1 3 3
Full Key Scenario Metric val
rand_key scenario Data Frame 1 A 0.824102 0.525212 0.386341 0.590881
B 0.137524 0.808270 0.965826 0.779796
C 0.239335 0.867260 0.808115 0.063681
Data Frame 2 X 0.231228 0.589685 0.137487 0.678441
Y 0.992191 0.285752 0.760913 0.046527
Z 0.332536 0.944553 0.636517 0.601849
如果需要删除级别 val
:
df_con = df_con.reset_index(level='val', drop=True)
print (df_con)
0 1 3 3
Full Key Scenario Metric
rand_key scenario Data Frame 1 0.686811 0.726811 0.479694 0.367657
Data Frame 1 0.839970 0.454164 0.321366 0.092720
Data Frame 1 0.060438 0.090951 0.682706 0.680736
Data Frame 2 0.243174 0.640461 0.069139 0.872920
Data Frame 2 0.109607 0.169056 0.467378 0.775949
Data Frame 2 0.854445 0.210386 0.076642 0.788915
最后写入 csv
:
df_con.to_csv('file.csv')
另一个解决方案是设置索引名称:
df_con.index.names = ["Full Key", "Scenario","Metric", 'val']
df_con.to_csv('file.csv')
最后一个解是rename_axis
:
df_con.rename_axis(["Full Key", "Scenario","Metric", 'val']).to_csv('file.csv')