首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有双行标题的宽数据透视到深数据帧

具有双行标题的宽数据透视到深数据帧
EN

Stack Overflow用户
提问于 2022-05-28 07:04:32
回答 2查看 64关注 0票数 1

我相信我能挺过这一关,甚至还能找到一些优雅的东西,但我很好奇其他人会如何处理这个问题:

我想要一个这样的数据:

代码语言:javascript
复制
| a1   | b1   | c1  |
| ---- | ---- | --- |
| a2   | b2   | c2  |
| ---  | ---  | --- |
| v1   | v2   | v3  |
| ...  | ...  | ... |
| v100 | v101 | v102|

并转换为这样的数据格式,其中x*是我可以为之提供列表的自定义头:

代码语言:javascript
复制
| x1  | x2  | x3   |
| --- | --- | ---- |
| a1  | a2  | v1   |
| ... | ... | ...  |
| a1  | a2  | v100 |
| b1  | b2  | v2   |
| ... | ... | ...  |
| b1  | b2  | v101 |
| c1  | c2  | v3   |
| ... | ... | ...  |
| c1  | c2  | v102 |

上下文是一个需要旋转的CSV导入,但是在这种情况下有两行标题将变成x1x2

任何建议或建议都非常感谢!再一次,自信能做到这一点与一些肘部油脂,但希望改善我的旋转和指数的直觉。

UPDATE:每个注释,下面是源和目标数据格式示例:

代码语言:javascript
复制
# source dataframe
df1 = pd.DataFrame(columns=['a1','b1','c1'], data=[['a2','b2','c2'],['v1','v2','v3'],['v100','v101','v102']])

"""
In [14]: df1                                                                                                                                                    
Out[14]: 
     a1    b1    c1
0    a2    b2    c2
1    v1    v2    v3
2  v100  v101  v102
"""

# target dataframe (where "x*" headers will be provided)
df2 = pd.DataFrame(columns=['x1','x2','x3'], data=[['a1','a2','v1'],['a1','a2','v100'],['b1','b2','v2'],['b1','b2','v101'],['c1','c2','v3'],['c1','c2','v102']])

"""
In [16]: df2                                                                                                                                                    
Out[16]: 
   x1  x2    x3
0  a1  a2    v1
1  a1  a2  v100
2  b1  b2    v2
3  b1  b2  v101
4  c1  c2    v3
5  c1  c2  v102
"""
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-28 18:31:30

这是一个多步骤的重塑:

代码语言:javascript
复制
(df1.T
 .set_index(0, append=True)
 .rename_axis(['x1', 'x2'])
 .stack()
 .droplevel(-1)
 .reset_index(name='x3')
)

输出:

代码语言:javascript
复制
   x1  x2    x3
0  a1  a2    v1
1  a1  a2  v100
2  b1  b2    v2
3  b1  b2  v101
4  c1  c2    v3
5  c1  c2  v102
票数 1
EN

Stack Overflow用户

发布于 2022-05-28 11:48:55

如果我正确地理解了您的初始DataFrame,我可以这样创建它:

代码语言:javascript
复制
import pandas as pd
n = 100
listA = [f'V{x}' for x in range(1,n+1)]
listA.insert(0,("a1"))
listA.insert(1,"a2")
listB = [f'V{x}' for x in range(n+1,2*n+1)]
listB.insert(0,("b1"))
listB.insert(1,"b2")
listC = [f'V{x}' for x in range(2*n+1,3*n+1)]
listC.insert(0,("c1"))
listC.insert(1,"c2")
data = [listA, listB, listC]
df = pd.DataFrame(data).T

现在,您可以创建一个空的DataFrame,其中包含三个列:"x1“、"x2”、"x3“:

代码语言:javascript
复制
newDF = pd.DataFrame( columns=["x1", "x2", "x3"])

然后在for循环中添加行,选择原始DataFrame中元素的位置:

代码语言:javascript
复制
for i in range(3):
    for j in range(n):
        row = [df.iloc[0][i],df.iloc[1][i], df.iloc[j+2][i]]
        newDF.loc[len(newDF.index)] = row

希望对你有用。

更新

根据你的最新消息:

从列标题创建一个row0:

代码语言:javascript
复制
row0 = pd.DataFrame(list(df1.columns)).T

您可以更改row0和df1的列名:

代码语言:javascript
复制
row0.columns = ["x1","x2","x3"]
df1.columns = ["x1","x2","x3"]

您将row0和df1连接在一个dnew DataFrame中:

代码语言:javascript
复制
dnew = pd.concat([row0, df])

您可以创建df2:

代码语言:javascript
复制
df2 = pd.DataFrame(columns=["x1", "x2", "x3"])
for i in range(len(dnew.columns)):
    for j in range(len(dnew)-2):
        row = [dnew.iloc[0][i],dnew.iloc[1][i], dnew.iloc[j+2][i]]
        df2.loc[len(df2)] = row
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72413597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档