我正在尝试 reshape 下面的数据框(从 .csv 导入),将东距、北距和节点名称值保留在同一行上,但将所有内容“堆叠”在 4 列中。因此,我希望 V0e、V0n 和 Vd 列中的数据位于 S0_Pe、S0_Pn 和 S0_Pd 列中的数据之上。实际上,有 8 组这样的东向/北向/交点三重奏。
我是否需要将 V0e、V0n、S0_Pe 和 S0_Pn 重命名为“Easting”和“Northing”,将 Vd 和 S0_Pd 重命名为“Node”?
我尝试过 grouby、stack 和melt,但要么所有内容最终都变成两列(“镜头”和其他所有内容),要么无法按我想要的方式分组。
我还查看了 MultiIndex,其中节点位于东向/北向对之上,但我未能将其应用于从 .csv 文件加载的现有 df。
Index shot V0e V0n Vd S0_Pe S0_Pn S0_Pd
0 1001 530811.1 6764623.3 Vd nan nan S0_Pd
1 1002 530808.8 6764617.4 Vd 530771.3 6764510.4 S0_Pd
2 1003 530806.6 6764611.4 Vd nan nan S0_Pd
3 1004 530804.2 6764605.8 Vd 530765.6 6764499.1 S0_Pd
我不介意它看起来像这样:
Index shot V0e V0n Vd
0 1001 530811.1 6764623.3 Vd
1 1002 530808.8 6764617.4 Vd
2 1003 530806.6 6764611.4 Vd
3 1004 530804.2 6764605.8 Vd
4 1001 nan nan S0_Pd
5 1002 530771.3 6764510.4 S0_Pd
6 1003 nan nan S0_Pd
7 1004 530765.6 6764499.1 S0_Pd
或者这个,我只需要坐标对和节点一起移动:
Index shot V0e V0n Vd
0 1001 530811.1 6764623.3 Vd
1 1001 nan nan S0_Pd
2 1002 530808.8 6764617.4 Vd
3 1002 530771.3 6764510.4 S0_Pd
4 1003 530806.6 6764611.4 Vd
5 1003 nan nan S0_Pd
6 1004 530804.2 6764605.8 Vd
7 1004 530765.6 6764499.1 S0_Pd
最佳答案
您可以使用经常被遗忘的pd.lreshape
来执行此操作:
此函数是 pd.wide_to_long
的通用版本,您可以在其中传递 {new_column name: [*columns to Vertical stack]}
的字典。然后,该字典中任何未指定的列都会被melt
编辑以适合输出。
import pandas as pd
out = pd.lreshape(
df,
{'V0e': ['V0e', 'S0_Pe'],
'V0n': ['V0n', 'S0_Pn'],
'Vd': ['Vd', 'S0_Pd']},
dropna=False
)
print(out)
Index shot V0e V0n Vd
0 0 1001 530811.1 6764623.3 Vd
1 1 1002 530808.8 6764617.4 Vd
2 2 1003 530806.6 6764611.4 Vd
3 3 1004 530804.2 6764605.8 Vd
4 0 1001 NaN NaN S0_Pd
5 1 1002 530771.3 6764510.4 S0_Pd
6 2 1003 NaN NaN S0_Pd
7 3 1004 530765.6 6764499.1 S0_Pd
关于python - 我正在尝试 Stack、Melt、Grouby 或 reshape Pandas DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72279246/