Python 更改panda数据帧的体系结构(索引-列)
首先,这是我在StackOverflow中的第一个问题,然后告诉我是否做错了什么(对不起我的英语,我是法国人:) 这个问题是找到用Python脚本更改数据帧体系结构的最佳方法 这就是我所拥有的(数据帧): 这就是我想要的(总行的结果,但带有点id) 为了做到这一点,我尝试了几种方法,但没有人能为我工作(或者我没有设法让它们工作),我尝试使用stack()函数和dataframe的multiIndex函数 如果你有任何帮助我的想法,请与我分享Python 更改panda数据帧的体系结构(索引-列),python,pandas,Python,Pandas,首先,这是我在StackOverflow中的第一个问题,然后告诉我是否做错了什么(对不起我的英语,我是法国人:) 这个问题是找到用Python脚本更改数据帧体系结构的最佳方法 这就是我所拥有的(数据帧): 这就是我想要的(总行的结果,但带有点id) 为了做到这一点,我尝试了几种方法,但没有人能为我工作(或者我没有设法让它们工作),我尝试使用stack()函数和dataframe的multiIndex函数 如果你有任何帮助我的想法,请与我分享 提前谢谢 可能是一些.loc过滤,ffill然后mel
提前谢谢 可能是一些
.loc
过滤,ffill
然后melt
与groupby
一起,然后是unstack
df.loc[df['Point'].eq('TOTAL'),'var'] = 'Total'
df['Point'] = df['Point'].replace('TOTAL',np.nan).ffill()
df1 = df.ffill().loc[df["var"].eq("Total")].drop("var", axis=1).melt(
id_vars=["Name", "Point", "LoadCase"]
).groupby(["Name", "Point", "LoadCase", "variable"]).first().unstack("LoadCase").reset_index()
print(df1)
Name Point variable value
LoadCase LC1 LC2
0 Name1 point1 Data1 8 17
1 Name1 point1 Data2 9 18
2 Name1 point1 Data3 10 19
3 Name2 point2 Data1 26 35
4 Name2 point2 Data2 27 36
5 Name2 point2 Data3 28 37
您可以创建一个布尔列来跟踪哪些行是“总计”行,清除并向前填充“点”,然后熔化并旋转数据
将熊猫作为pd导入
将numpy作为np导入
df['is_total']=df.Point.eq('total'))
df['Point']=df.Point.replace('TOTAL',np.nan)
out=(df.ffill()
.query('is_total')
.drop('is_total',轴=1)
.melt(id_vars=['Name','Point','LoadCase'],var_Name='Data')
.pivot_表(索引=['Name','Point','Data'],columns='LoadCase')
)
out.columns=out.columns.get\u级别\u值(-1)
out=out.reset_index()
出来
#返回:
LoadCase名称点数据LC1 LC2
0名称1点1数据1 8 17
1名称1点1数据2 9 18
2名称1点1数据3 10 19
3名称2点2数据1 26 35
4名称2点2数据2 27 36
5名称2点2数据3 28 37
是类型为str
或numpy.nan
的NA
的值。数据帧是从csv文件生成的。与csv文件中的空数据相对应的NA值。确切的值是NaN,我想是numpy.NaN,但不确定,我会检查这个。我仍然有错误。因为我的panda版本是0.19,所以我必须更改melt语法,然后我尝试这样做:`df['is_total']=df.Point.eq('total')df['Point']=df.Point.replace('total',np.nan)out=(df.ffill().query('is_total')。drop('is_total',axis=1)out1=pd.melt(out,id_vars='Name','Point','LoadCase',']),var_Name='Data')out1.pivot\表(索引)=['Name','Point','Data'],columns='LoadCase')out1.columns=out1.columns.get_level_值(-1)out1=out1.reset_index()`但我仍然有一列负载情况,而不是每个负载情况都有一列。我做错了什么?Thansk对于您的回答,它似乎是有效的。但是您知道,是否有可能将此数据帧放入csv中,并使用以下列:Name-Point-variable-LC1-LC2,而不是Name-Point-variable-value?
Name Point Data LC1 LC2
0 Name1 Point1 Data1 8 17
1 Name1 Point1 Data2 9 18
2 Name1 Point1 Data3 10 19
3 Name2 Point2 Data1 26 35
4 Name2 Point2 Data2 27 36
5 Name2 Point2 Data3 28 37
df.loc[df['Point'].eq('TOTAL'),'var'] = 'Total'
df['Point'] = df['Point'].replace('TOTAL',np.nan).ffill()
df1 = df.ffill().loc[df["var"].eq("Total")].drop("var", axis=1).melt(
id_vars=["Name", "Point", "LoadCase"]
).groupby(["Name", "Point", "LoadCase", "variable"]).first().unstack("LoadCase").reset_index()
print(df1)
Name Point variable value
LoadCase LC1 LC2
0 Name1 point1 Data1 8 17
1 Name1 point1 Data2 9 18
2 Name1 point1 Data3 10 19
3 Name2 point2 Data1 26 35
4 Name2 point2 Data2 27 36
5 Name2 point2 Data3 28 37