python - 我正在尝试 Stack、Melt、Grouby 或 reshape Pandas DataFrame

标签 python pandas dataframe multi-index pandas-melt

我正在尝试 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/

相关文章:

python - 列表理解转换

python - 使用pdfminer水平读取pdf文件

python - Pygame:绘制矩形的奇怪行为

python - 使用日期范围迭代一系列带日期标记的 XHR 请求

python - Pandas-在数据帧之外的多个系列上使用 "any"和 "all"

python - 通过迭代覆盖 Pandas DataFrame 中的值?

dataframe - julia dataframe - 按值列表对列进行子集化

python-3.x - 将谷歌存储桶中的所有 .csv 文件读取到一个 Pandas df 中,然后以 .csv 格式保存回另一个存储桶

python - 如何从 pandas 数据框中过滤特定值与正则表达式匹配的行

python - 如何正确使用带有包含间隔的多索引的 Pandas Dataframe?