Python 重塑数据帧,包括重复的列 df=pd.DataFrame({'Type':['A','A','B'], “Var1”:[1.0,2.0,3.0], ‘Var2’:[21.0,22.0,23.0], ‘Var3’:[np.nan,4.0,5.0], ‘Var4’:[np.nan,24.0,25.0] })

Python 重塑数据帧,包括重复的列 df=pd.DataFrame({'Type':['A','A','B'], “Var1”:[1.0,2.0,3.0], ‘Var2’:[21.0,22.0,23.0], ‘Var3’:[np.nan,4.0,5.0], ‘Var4’:[np.nan,24.0,25.0] }),python,pandas,Python,Pandas,在数据集中,Var3和Var4分别与Var1和Var2相同。有时Var3和Var4可能同时是NAN。我想将数据帧重塑为 | | Type | Var1 | Var2 | |---|------|-----:|-----:| | 0 | A | 1.0 | 21.0 | | 1 | A | 2.0 | 22.0 | | 2 | A | 4.0 | 24.0 | | 3 | B | 3.0 | 23.0 | | 4 | B | 5.0 | 25.0 |

在数据集中,
Var3
Var4
分别与
Var1
Var2
相同。有时
Var3
Var4
可能同时是
NAN
。我想将数据帧重塑为

|   | Type | Var1 | Var2 |
|---|------|-----:|-----:|
| 0 |    A |  1.0 | 21.0 |
| 1 |    A |  2.0 | 22.0 |
| 2 |    A |  4.0 | 24.0 |
| 3 |    B |  3.0 | 23.0 |
| 4 |    B |  5.0 | 25.0 |

您可以尝试
concat
并分别选择列,在Var3和Var4上使用
rename
,然后使用
dropna
sort\u index
reset\u index
获得预期结果的形状

res = (pd.concat([df[['Type', 'Var1','Var2']], 
                  df[['Type', 'Var3','Var4']]
                    .rename(columns={'Var3':'Var1', 'Var4':'Var2'})])
         .dropna(subset=['Var1','Var2'], how='all')
         .sort_index()
         .reset_index(drop=True)
      )
print(res)
  Type  Var1  Var2
0    A   1.0  21.0
1    A   2.0  22.0
2    A   4.0  24.0
3    B   3.0  23.0
4    B   5.0  25.0
注释后编辑:由于可以多次重复列,因此可以尝试执行以下操作

#get all columns var1 and var2 independently, note that type must be the first one
l_var1 = df.columns[1:][0::2]
l_var2 = df.columns[1:][1::2]
res = (pd.concat([df[['Type', col_var1, col_var2]]
                    .rename(columns={col_var1:'Var1', col_var2:'Var2'})
                  for col_var1, col_var2 in zip(l_var1, l_var2)])
         .dropna(subset=['Var1','Var2'], how='all')
         .sort_index()
         .reset_index(drop=True)
      )
只要一个简单的
concat()
就可以了<代码>重命名()列和
dropna()

输出

  Type  Var1  Var2
0    A   1.0  21.0
1    A   2.0  22.0
2    B   3.0  23.0
3    A   4.0  24.0
4    B   5.0  25.0

类似于隐藏函数
lreshape
,注意,这个函数没有很好的文档记录

df=pd.lreshape(df, {'Var1': ['Var1', 'Var3'], 'Var2': ['Var2', 'Var4']}).sort_values('Type')
df
Out[107]: 
  Type  Var1  Var2
0    A   1.0  21.0
1    A   2.0  22.0
3    A   4.0  24.0
2    B   3.0  23.0
4    B   5.0  25.0
代码:

输出:

  Type  Var1  Var2
0    A   1.0  21.0
1    A   2.0  22.0
2    A   4.0  24.0
3    B   3.0  23.0
4    B   5.0  25.0

非常感谢你的回答。我还有一个问题。真正的数据集有数千个重复的列。如果重复列的名称中有逻辑,是否有一种有效的方法来构造
concat
?@WZhao?或者是否每X列组织一次?您能提供更多详细信息吗?由于原始数据以csv格式存储,因此可以在导入过程中更改列名。假设在第一列
Type
之后,每两列Var1和Var2重复20次。因此,总共有41列。@WZhao查看编辑,您可以获得列列表或var1和var2,然后使用列表理解:)注意,最后的名称var1和var2在这里是硬编码的,因此您可以更改为您想要的任何名称(也可以在dropna中更改)
df=pd.lreshape(df, {'Var1': ['Var1', 'Var3'], 'Var2': ['Var2', 'Var4']}).sort_values('Type')
df
Out[107]: 
  Type  Var1  Var2
0    A   1.0  21.0
1    A   2.0  22.0
3    A   4.0  24.0
2    B   3.0  23.0
4    B   5.0  25.0
import pandas as pd
import numpy as np

df = pd.DataFrame({'Type' : ['A', 'A', 'B'],
'Var1' : [1.0, 2.0, 3.0],
'Var2' : [21.0, 22.0, 23.0],
'Var3' : [np.nan, 4.0, 5.0],
'Var4' : [np.nan, 24.0, 25.0]
})

df1, df2 = df[['Type','Var1','Var2']], df[['Type','Var3','Var4']]
df2.rename(columns = {"Var3":"Var1","Var4":"Var2"}, inplace = True)
df3 = pd.concat([df1,df2])
df3.dropna(inplace = True)
df3.sort_values(by = 'Type', inplace = True)
print(df3.reset_index(drop=True))
  Type  Var1  Var2
0    A   1.0  21.0
1    A   2.0  22.0
2    A   4.0  24.0
3    B   3.0  23.0
4    B   5.0  25.0