如果列名称匹配,则将数据框列值更改为行

我将 json 对象规范化为数据帧,json_normalize如下所示:


ID Name     Email_id      ID Name Email_id     ID Name  Email_id

1   A      A@gmail.com     2  B    B@gmail.com  3  C    C@gmail.com

我想将列值转换为这样的行:-


ID   Name   Email_id

1     A      A@gmil.com

2     B      B@gmail.com

3     C      C@gmail.com

但我无法做到这一点。我尝试过pd.melt(),但它给了我Data must be 1-dimensional例外。


倚天杖
浏览 119回答 2
2回答

潇潇雨雨

您只能选择一列,但由于重复的列名称被选择,因此选择了具有相同标签的所有列,然后转换为1dnumpy 数组并传递给DataFrame构造函数:print (df['ID'])   ID  ID  ID0   1   2   3df = pd.DataFrame({'ID': df['ID'].to_numpy().ravel(),                   'Name': df['Name'].to_numpy().ravel(),                   'Email_id': df['Email_id'].to_numpy().ravel()})print (df)   ID Name     Email_id0   1    A  A@gmail.com1   2    B  B@gmail.com2   3    C  C@gmail.com另一个想法是MultiIndex在列中创建GroupBy.cumcount并通过以下方式重塑DataFrame.stack:s = df.columns.to_series()df.columns = [s, s.groupby(s).cumcount()]print (df)  ID Name     Email_id ID Name     Email_id ID Name     Email_id   0    0            0  1    1            1  2    2            20  1    A  A@gmail.com  2    B  B@gmail.com  3    C  C@gmail.comdf = df.stack().reset_index(drop=True)print (df)      Email_id  ID Name0  A@gmail.com   1    A1  B@gmail.com   2    B2  C@gmail.com   3    C

ibeautiful

如果您确实知道这样的数据结构是一致的,您可以按索引对数据进行切片,然后连接它们:pd.concat([df.iloc[:, i:i+3] for i in range(0, df.shape[1], 3)])要确保获取列 ID:import numpy as np# Get the target indexesidx = np.arange(df.shape[1])[df.columns=='ID']idx = np.append(idx, df.shape[1])# Slice and concatenate datapd.concat([df.iloc[:, idx[i]:idx[i+1]] for i in range(len(idx)-1)])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python