我相信我能挺过这一关,甚至还能找到一些优雅的东西,但我很好奇其他人会如何处理这个问题:
我想要一个这样的数据:
| a1 | b1 | c1 |
| ---- | ---- | --- |
| a2 | b2 | c2 |
| --- | --- | --- |
| v1 | v2 | v3 |
| ... | ... | ... |
| v100 | v101 | v102|并转换为这样的数据格式,其中x*是我可以为之提供列表的自定义头:
| x1 | x2 | x3 |
| --- | --- | ---- |
| a1 | a2 | v1 |
| ... | ... | ... |
| a1 | a2 | v100 |
| b1 | b2 | v2 |
| ... | ... | ... |
| b1 | b2 | v101 |
| c1 | c2 | v3 |
| ... | ... | ... |
| c1 | c2 | v102 |上下文是一个需要旋转的CSV导入,但是在这种情况下有两行标题将变成x1和x2。
任何建议或建议都非常感谢!再一次,自信能做到这一点与一些肘部油脂,但希望改善我的旋转和指数的直觉。
UPDATE:每个注释,下面是源和目标数据格式示例:
# 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
"""发布于 2022-05-28 18:31:30
这是一个多步骤的重塑:
(df1.T
.set_index(0, append=True)
.rename_axis(['x1', 'x2'])
.stack()
.droplevel(-1)
.reset_index(name='x3')
)输出:
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发布于 2022-05-28 11:48:55
如果我正确地理解了您的初始DataFrame,我可以这样创建它:
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“:
newDF = pd.DataFrame( columns=["x1", "x2", "x3"])然后在for循环中添加行,选择原始DataFrame中元素的位置:
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:
row0 = pd.DataFrame(list(df1.columns)).T您可以更改row0和df1的列名:
row0.columns = ["x1","x2","x3"]
df1.columns = ["x1","x2","x3"]您将row0和df1连接在一个dnew DataFrame中:
dnew = pd.concat([row0, df])您可以创建df2:
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)] = rowhttps://stackoverflow.com/questions/72413597
复制相似问题