为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

倚天杖 2023-12-12 10:15:19
我将 json 对象规范化为数据帧,json_normalize如下所示:ID Name     Email_id      ID Name Email_id     ID Name  Email_id1   A      A@gmail.com     2  B    B@gmail.com  3  C    C@gmail.com我想将列值转换为这样的行:-ID   Name   Email_id1     A      A@gmil.com2     B      B@gmail.com3     C      C@gmail.com但我无法做到这一点。我尝试过pd.melt(),但它给了我Data must be 1-dimensional例外。
查看完整描述

2 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

您只能选择一列,但由于重复的列名称被选择,因此选择了具有相同标签的所有列,然后转换为1dnumpy 数组并传递给DataFrame构造函数:


print (df['ID'])

   ID  ID  ID

0   1   2   3


df = 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_id

0   1    A  A@gmail.com

1   2    B  B@gmail.com

2   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            2

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


df = df.stack().reset_index(drop=True)

print (df)

      Email_id  ID Name

0  A@gmail.com   1    A

1  B@gmail.com   2    B

2  C@gmail.com   3    C


查看完整回答
反对 回复 2023-12-12
?
ibeautiful

TA贡献1993条经验 获得超5个赞

如果您确实知道这样的数据结构是一致的,您可以按索引对数据进行切片,然后连接它们:


pd.concat([df.iloc[:, i:i+3] for i in range(0, df.shape[1], 3)])

要确保获取列 ID:


import numpy as np


# Get the target indexes

idx = np.arange(df.shape[1])[df.columns=='ID']

idx = np.append(idx, df.shape[1])


# Slice and concatenate data

pd.concat([df.iloc[:, idx[i]:idx[i+1]] for i in range(len(idx)-1)])


查看完整回答
反对 回复 2023-12-12
  • 2 回答
  • 0 关注
  • 60 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信