将列值转换为行值

2024-09-28 12:14:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据集(171列),当我把它放到我的数据帧中时,它看起来像这样-

ANO MNO UJ2010  DJ2010   UF2010 DF2010   UM2010 DM2010    UA2010    DA2010 ...
1   A   113   06/01/2010    129 06/02/2010  143 06/03/2010  209 05/04/2010 ...
2   B   218   06/01/2010    211 06/02/2010  244 06/03/2010  348 05/04/2010 ...
3   C   22    06/01/2010    114 06/02/2010  100 06/03/2010  151 05/04/2010 ...

现在我想这样改变我的数据帧-

^{pr2}$

我试图使用pd.melt,但我认为它不能完全满足我的目的。在

如果有人在这个问题上帮助我,那就太好了:)


Tags: 数据目的pdanomnomeltpr2df2010
3条回答

在筛选要分组到不同标题下的列之后,请使用^{}作为^{}的最接近替代项。在

通过使用pd.lreshape,当您将dictionary对象作为它的groups参数注入时,键将采用新的头名称,而作为dict值的所有列名列表都将被强制转换到该头下。因此,它在转换之后生成一个长格式的DF。在

最后,对未使用的列进行DFw.r.t排序,以相应地对齐这些列。在

然后,在末尾添加reset_index(drop=True),通过删除中间索引,将索引轴重新标记为默认整数值。在

d = pd.lreshape(df, {"Time": df.filter(regex=r'^D').columns, 
                     "Unit": df.filter(regex=r'^U').columns})

d.sort_values(['ANO', 'MNO']).reset_index(drop=True)

enter image description here


如果分组列的长度不匹配,则:

^{pr2}$

继续上面提到的对pd.lreshape执行相同的步骤,但这次包含了dropna=False参数。在

您可以通过^{}来重塑形状,但是首先在具有%和{}的列中创建{}。在

MultiIndex值将对Time和{}映射到MultiIndex的第二层,//2构成,每对的差异由模除(%)产生。在

然后stack使用//创建的最后一个级别,并在index中创建新的多索引级别,这是不必要的,因此被reset_index(level=2, drop=True)删除。在

将第一级和第二级转换为columns的最后一次重置索引。在

[[1,0]]用于更改顺序的交换列。在

df = df.set_index(['ANO','MNO'])
cols = np.arange(len(df.columns))
df.columns = [cols % 2, cols // 2]

print (df)
           0           1    0           1    0           1    0           1
           0           0    1           1    2           2    3           3
ANO MNO                                                                    
1   A    113  06/01/2010  129  06/02/2010  143  06/03/2010  209  05/04/2010
2   B    218  06/01/2010  211  06/02/2010  244  06/03/2010  348  05/04/2010
3   C     22  06/01/2010  114  06/02/2010  100  06/03/2010  151  05/04/2010

df = df.stack()[[1,0]].reset_index(level=2, drop=True).reset_index()
df.columns = ['ANO','MNO','Time','Unit']
print (df)
    ANO MNO        Time  Unit
0     1   A  06/01/2010   113
1     1   A  06/02/2010   129
2     1   A  06/03/2010   143
3     1   A  05/04/2010   209
4     2   B  06/01/2010   218
5     2   B  06/02/2010   211
6     2   B  06/03/2010   244
7     2   B  05/04/2010   348
8     3   C  06/01/2010    22
9     3   C  06/02/2010   114
10    3   C  06/03/2010   100
11    3   C  05/04/2010   151

编辑:

^{pr2}$

df = df.set_index(['ANO','MNO'])
#MultiIndex is created by first character of column names with all another
df.columns = [df.columns.str[0], df.columns.str[1:]]
print (df)
            U           D     U           D     U           D     U
        J2010       J2010 F2010       F2010 M2010       M2010 A2010
ANO MNO                                                            
1   A     113  06/01/2010   129  06/02/2010   143  06/03/2010   209
2   B     218  06/01/2010   211  06/02/2010   244  06/03/2010   348
3   C      22  06/01/2010   114  06/02/2010   100  06/03/2010   151


#stack add missing values, replace them by NaN
df = df.stack().reset_index(level=2, drop=True).reset_index()
df.columns = ['ANO','MNO','Time','Unit']
print (df)
    ANO MNO        Time  Unit
0     1   A         NaN   209
1     1   A  06/02/2010   129
2     1   A  06/01/2010   113
3     1   A  06/03/2010   143
4     2   B         NaN   348
5     2   B  06/02/2010   211
6     2   B  06/01/2010   218
7     2   B  06/03/2010   244
8     3   C         NaN   151
9     3   C  06/02/2010   114
10    3   C  06/01/2010    22
11    3   C  06/03/2010   100

您可以将^{}^{}一起使用。解决方案很简单-只需将所有相关列(通过iloc选择)一个接一个地垂直堆叠并连接它们:

def rename(sub_df):
    sub_df.columns = ["ANO", "MNO", "Time", "Unit"]
    return sub_df

pd.concat([rename(df.iloc[:, [0, 1, x+1, x]])
           for x in range(2, df.shape[1], 2)])

    ANO     MNO     Time    Unit
0   1       A   06/01/2010  113
1   2       B   06/01/2010  218
2   3       C   06/01/2010  22
0   1       A   06/02/2010  129
1   2       B   06/02/2010  211
2   3       C   06/02/2010  114
0   1       A   06/03/2010  143
1   2       B   06/03/2010  244
2   3       C   06/03/2010  100
0   1       A   05/04/2010  209
1   2       B   05/04/2010  348
2   3       C   05/04/2010  151

相关问题 更多 >

    热门问题