如何使用pandas转置行和列?

3

我是新手pandas,我得到的结果与我的期望结果相反。

我尝试过以下方法:

o_rg、o_gg、a_rg、a_gg都是数组

    df1=pd.DataFrame({'RED':o_rg,'GREEN':o_gg})
df2=pd.DataFrame({'RED':a_rg,'RED':a_gg})
df=df1-(df2)
print(df)
pop_complete = pd.concat([df.T,
                          df1.T,
                          df2.T],
                          keys=["O-A", "O", "A"])
df = pop_complete.swaplevel()
df.sort_index(inplace=True)

print(df)
df.to_csv("OUT.CSV")

我获得的输出是:

             0      1       2
RED        A        14.0    12.0    15.0
           O        14.0    12.0    15.0
           O-A      0.00    0.00    0.00
GREEN      A        12.0    10.0    12.0
           O        14.0    9.0     12.0
           O-A      -2.0    1.0     0.0

我真正想要的是:

                    RED     GREEN       

        A1 O        14.0     14.0
           A        14.0     12.0
           O-A      0.0      2.0

        A3 O        12.0     9.0
           A        12.0     10.0
           O-A      0.0      -1.0

        A8 O        15.0     12.0
           A        15.0     12.0
           O-A      0.0      0.0

 where 'A1','A3','A8' ... can be stored in array cases=[]

如何获取实际输出?


我认为最后的编辑非常复杂,请创建一个新的问题。 - jezrael
@jezrael。将会完成。 - codeuser
@jezrael。创建了新的问题。如何使用Pandas以及将表格导出为CSV格式,以获得我期望的输出?https://stackoverflow.com/questions/57667106/how-to-get-a-table-in-a-format-using-pandas-and-export-to-csv - codeuser
1个回答

2
您可以使用concat简化解决方案,无需转置和axis=1,重命名索引值,然后通过DataFrame.stack进行重塑:

最初的回答
o_rg = [14,12,15]
o_gg = [14,9,12]

a_rg = [14,12,15] 
a_gg = [14,10,15]

df1=pd.DataFrame({'RED':o_rg,'GREEN':o_gg})
df2=pd.DataFrame({'RED':a_rg,'GREEN':a_gg})
df=df1-(df2)
print(df)
   RED  GREEN
0    0      0
1    0     -1
2    0     -3

pop_complete = pd.concat([df, df1, df2], keys=["O-A", "O", "A"], axis=1)
pop_complete.index = ['A1','A3','A8']
print(pop_complete)
   O-A         O         A      
   RED GREEN RED GREEN RED GREEN
A1   0     0  14    14  14    14
A3   0    -1  12     9  12    10
A8   0    -3  15    12  15    15

df1 = pop_complete.stack(0)[['RED','GREEN']].reindex(["O", "A", "O-A"], axis=0, level=1)
print (df1)
        RED  GREEN
A1 O     14     14
   A     14     14
   O-A    0      0
A3 O     12      9
   A     12     10
   O-A    0     -1
A8 O     15     12
   A     15     15
   O-A    0     -3

如果需要创建不重复的第一级MultiIndex文件(不建议使用),请使用此答案。最初的回答。

谢谢你提供的代码。我该如何按照“红色”、“绿色”的顺序获取列? - codeuser
1
@itsbinz - 你是对的,我在代码的最后一行添加了.reindex(["O", "A", "O-A"], axis=0, level=1) - jezrael
@jezrael 是的,我有。它显示“IndexError: 太多级别,索引只有1级,而不是2级”。 - codeuser
@itsbinz - 那么 a = df.index.get_level_values(0) df.index = pd.MultiIndex.from_arrays([a.where(a.duplicated(), ''), df.index.get_level_values(1)]) 不起作用吗?如果不行,那么 print (df.index.nlevels) 是什么? - jezrael
@itsbinz - 在写入CSV之前,print(df1.index.nlevels)是什么意思? - jezrael
显示剩余17条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接