我有兩個大小(mxn)的ndarray,以及兩個長度分別為m和n的串列。我想將這兩個矩陣轉換為具有四列的資料框。前兩列對應于 m 和 n 維,并包含串列中的值。接下來的兩列應包含來自兩個矩陣的值。總的來說,生成的資料幀應該有 m 乘以 n 行。
示例:如果這些是兩個矩陣和兩個串列,
a1 = np.array([[1, 2], [3, 4],[5,6]])
a2 = np.array([[10, 20], [30, 40],[50,60]])
l1 = [5,7,99]
l2 = [2,3]
那么生成的資料框應該如下所示:
"l1" "l2" "a1" "a2"
5 2 1 10
7 2 3 30
99 2 5 50
5 3 2 20
7 3 4 40
99 3 6 60
行的順序無關緊要。
盡管在這種特定情況下我只有兩個矩陣,但我很好奇一個可以輕松應用于任意數量的相同大小矩陣的解決方案。
uj5u.com熱心網友回復:
用于由 和np.vstack創建的連接陣列numpy.tile,numpy.repeat并numpy.ravel傳遞給DataFramecosntructor:
a = np.vstack((np.tile(l1, len(l2)),
np.repeat(l2, len(l1)),
np.ravel(a1, 'F'),
np.ravel(a2, 'F'))).T
print (a)
[[ 5 2 1 10]
[ 7 2 3 30]
[99 2 5 50]
[ 5 3 2 20]
[ 7 3 4 40]
[99 3 6 60]]
df = pd.DataFrame(a, columns=['l1','l2','a1','a2'])
print (df)
l1 l2 a1 a2
0 5 2 1 10
1 7 2 3 30
2 99 2 5 50
3 5 3 2 20
4 7 3 4 40
5 99 3 6 60
對于多個陣列:
arrays = [a1, a2]
arr = [np.ravel(a, 'F') for a in arrays]
a = np.vstack((np.tile(l1, len(l2)),
np.repeat(l2, len(l1)),
arr)).T
print (a)
[[ 5 2 1 10]
[ 7 2 3 30]
[99 2 5 50]
[ 5 3 2 20]
[ 7 3 4 40]
[99 3 6 60]]
df = pd.DataFrame(a, columns=['l1','l2'] [f'a{x 1}' for x in range(len(arrays))])
print (df)
l1 l2 a1 a2
0 5 2 1 10
1 7 2 3 30
2 99 2 5 50
3 5 3 2 20
4 7 3 4 40
5 99 3 6 60
熊貓唯一的解決方案concat和DataFrame.unstack:
df = (pd.concat([pd.DataFrame(a1, columns=l2, index=l1).unstack(),
pd.DataFrame(a2, columns=l2, index=l1).unstack()],
axis=1, keys=['a1','a2'])
.rename_axis(['l2','l1']).swaplevel(1,0).reset_index())
print (df)
l1 l2 a1 a2
0 5 2 1 10
1 7 2 3 30
2 99 2 5 50
3 5 3 2 20
4 7 3 4 40
5 99 3 6 60
對于多個陣列:
arrays = [a1, a2]
df = (pd.concat([pd.DataFrame(a, columns=l2, index=l1).unstack() for a in arrays],
axis=1)
.rename_axis(['l2','l1'])
.swaplevel(1,0)
.rename(columns=lambda x: f'a{x 1}')
.reset_index())
print (df)
l1 l2 a1 a2
0 5 2 1 10
1 7 2 3 30
2 99 2 5 50
3 5 3 2 20
4 7 3 4 40
5 99 3 6 60
uj5u.com熱心網友回復:
為多個陣列擴展出色的 jezrael 答案:
arrays = ... # e.g [a1, a2]
a = np.vstack([np.tile(l1, len(l2),
np.repeat(l2, len(l1))]
[np.ravel(a, 'F') for a in arrays]).T
uj5u.com熱心網友回復:
這應該可以解決您的問題:
import pandas as pd
import numpy as np
df=pd.DataFrame()
a1 = np.array([[1, 2], [3, 4],[5,6]])
a2 = np.array([[10, 20], [30, 40],[50,60]])
l1 = [5,7,99]
l2 = [2,3]
m,n=len(l1),len(l2)
temp_l1=[]
for i in l1:
temp_l1.extend([i]*n)
df["l1"]=temp_l1
df["l2"]=l2*m
df["a1"]=a1.flatten()
df["a2"]=a2.flatten()
print(df)
輸出:
l1 l2 a1 a2
0 5 2 1 10
1 5 3 2 20
2 7 2 3 30
3 7 3 4 40
4 99 2 5 50
5 99 3 6 60
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/467782.html
標籤:Python 熊猫 numpy-ndarray 不枢轴 熊猫融化
下一篇:計算每個資料框列的平均值
