Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 更改panda数据帧的体系结构(索引-列)_Python_Pandas - Fatal编程技术网

Python 更改panda数据帧的体系结构(索引-列)

Python 更改panda数据帧的体系结构(索引-列),python,pandas,Python,Pandas,首先,这是我在StackOverflow中的第一个问题,然后告诉我是否做错了什么(对不起我的英语,我是法国人:) 这个问题是找到用Python脚本更改数据帧体系结构的最佳方法 这就是我所拥有的(数据帧): 这就是我想要的(总行的结果,但带有点id) 为了做到这一点,我尝试了几种方法,但没有人能为我工作(或者我没有设法让它们工作),我尝试使用stack()函数和dataframe的multiIndex函数 如果你有任何帮助我的想法,请与我分享 提前谢谢 可能是一些.loc过滤,ffill然后mel

首先,这是我在StackOverflow中的第一个问题,然后告诉我是否做错了什么(对不起我的英语,我是法国人:)

这个问题是找到用Python脚本更改数据帧体系结构的最佳方法

这就是我所拥有的(数据帧):

这就是我想要的(总行的结果,但带有点id)

为了做到这一点,我尝试了几种方法,但没有人能为我工作(或者我没有设法让它们工作),我尝试使用stack()函数和dataframe的multiIndex函数

如果你有任何帮助我的想法,请与我分享


提前谢谢

可能是一些
.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