我有一个数据集,我需要将其撤消到多行到列中。
例:
ID Currency Val1 Val2 Month
101 INR 57007037.32 1292025.24 2021-03
101 INR 49171143.9 1303785.98 2021-02
101 INR 54039073.81 1469727.23 2021-01
101 INR 67733998.9 1370086.78 2020-12
101 INR 48838409.39 1203648.32 2020-11
101 INR 43119693.71 0 2020-10我需要按下面的方式来改变它们。
ID Currency Keys 2021-03 2021-02 2021-01 2020-12 2020-11 2020-10
101 INR Val1 57007037.32 49171143.9 54039073.81 67733998.9 48838409.39 4311.71
101 INR Val2 1292025.24 1303785.98 1469727.23 1370086.78 1203648.32 0我已经尝试过df.melt,但这并不是给出确切的输出。
df = pd.read_csv('/path/abc.csv')
print(df.melt(id_vars=['id'], var_name=['month'], value_vars=['val1','val2']))请帮我一下。
发布于 2021-04-25 07:51:59
使用.pivot的另一个版本
print(
pd.pivot(
df,
index=["ID", "Currency"],
columns="Month",
values=["Val1", "Val2"],
)
.stack(level=0)
.reset_index()
.rename(columns={"level_2": "keys"})
)指纹:
Month ID Currency keys 2020-10 2020-11 2020-12 2021-01 2021-02 2021-03
0 101 INR Val1 43119693.71 48838409.39 67733998.90 54039073.81 49171143.90 57007037.32
1 101 INR Val2 0.00 1203648.32 1370086.78 1469727.23 1303785.98 1292025.24编辑:在pandas=0.22.0中工作的解决方案
print(
df.set_index(["ID", "Currency"])
.pivot(columns="Month")
.stack(level=0)
.reset_index()
.rename(columns={"level_2": "keys"})
)指纹:
Month ID Currency keys 2020-10 2020-11 2020-12 2021-01 2021-02 2021-03
0 101 INR Val1 43119693.71 48838409.39 67733998.90 54039073.81 49171143.90 57007037.32
1 101 INR Val2 0.00 1203648.32 1370086.78 1469727.23 1303785.98 1292025.24编辑:对列进行排序:
x = (
df.set_index(["ID", "Currency"])
.pivot(columns="Month")
.stack(level=0)
.reset_index()
.rename(columns={"level_2": "keys"})
)
x.columns.name = ""
x = x[["ID", "Currency", "keys"] + sorted(x.columns, reverse=True)[3:]]
print(x)指纹:
ID Currency keys 2021-03 2021-02 2021-01 2020-12 2020-11 2020-10
0 101 INR Val1 57007037.32 49171143.90 54039073.81 67733998.90 48838409.39 43119693.71
1 101 INR Val2 1292025.24 1303785.98 1469727.23 1370086.78 1203648.32 0.00发布于 2021-04-25 07:50:13
1. stack和unstack
(df.set_index(['ID', 'Currency', 'Month']).stack()
.unstack(-2).reset_index().rename(columns={'level_2': 'keys'}))2. Melt和pivot
df.melt(['ID', "Currency", 'Month'], var_name='keys')\
.pivot(['ID', 'Currency', 'keys'], 'Month', 'value').reset_index()Month ID Currency keys 2020-10 2020-11 2020-12 2021-01 2021-02 2021-03
0 101 INR Val1 43119693.71 48838409.39 67733998.90 54039073.81 49171143.90 57007037.32
1 101 INR Val2 0.00 1203648.32 1370086.78 1469727.23 1303785.98 1292025.24发布于 2021-04-25 07:57:16
另一种方法:
>>> df.groupby(["ID", "Currency"]) \
.apply(lambda x: x[["Month", "Val1", "Val2"]] \
.set_index("Month") \
.rename_axis(columns="Key") \
.transpose())
Month 2021-03 2021-02 2021-01 2020-12 2020-11 2020-10
ID Currency Key
101 INR Val1 57007037.32 49171143.90 54039073.81 67733998.90 48838409.39 43119693.71
Val2 1292025.24 1303785.98 1469727.23 1370086.78 1203648.32 0.00对于0.24之前的Pandas版本,将rename_axis(columns="Key")更改为rename_axis("Key", axis="columns")
https://stackoverflow.com/questions/67250796
复制相似问题