我相信我可以應付這個問題,甚至可能會找到一些優雅的東西,但我很好奇其他人會如何解決這個問題:
我想采用這樣的資料框:
| 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。
非常感謝任何提示或建議!同樣,自信可以用一些肘部油脂來做到這一點,但想提高我的旋轉和索引直覺。
更新:根據評論,這里是源和目標資料框示例:
# 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
"""
uj5u.com熱心網友回復:
這是一個多步驟重塑:
(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
uj5u.com熱心網友回復:
如果我正確理解了您的初始 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"]
您在 dnew DataFrame 中連接 row0 和 df1:
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)] = row
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/483591.html
