สร้างเมทริกซ์ความแปรปรวนร่วมแบบตัวเลขจาก Pandas DataFrame ของความแปรปรวนร่วม

ฉันมีวัตถุ pandas.DataFrame ต่อไปนี้ที่ให้ความแปรปรวนร่วมระหว่างปัจจัย:

import pandas as pd

df = pd.DataFrame({"factor1": ["A", "A", "A", "B", "B", "C"],
                   "factor2": ["A", "B", "C", "B", "C", "C"],
                   "covar": [-1.2, -1, 2, 3.4, -4, 6.2]})

วัตถุประสงค์ของฉันคือฟอร์แมต DataFrame ใหม่ให้เป็นค่าบวกแบบกึ่งแน่นอนความแปรปรวนร่วม numpy.ndarray

ฉันได้พัฒนาวิธีแก้ปัญหาที่ใช้งานได้ แต่มันช้ามาก:

unique_factors = df.factor1.unique()
F = pd.DataFrame(columns=unique_factors, index=unique_factors)
for index, row in df.iterrows():
    F.loc[row["factor1"], row["factor2"]] = row["covar"]**2
    F.loc[row["factor2"], row["factor1"]] = row["covar"]**2 #inefficient
F = F.to_numpy()

ผลลัพธ์ที่ได้คือ:

[[1.44 1.0                4.0               ]
 [1.0  11.559999999999999 16.0              ]
 [4.0  16.0               38.440000000000005]]

ฉันหวังว่าฉันจะสามารถใช้ประโยชน์จากวิธีการดั้งเดิมของ numpy เพื่อให้บรรลุวัตถุประสงค์ของฉันได้อย่างมีประสิทธิภาพมากขึ้น อย่างน้อยที่สุด ฉันอยากจะลบบรรทัดที่มีความคิดเห็น #inefficient ออก และสะท้อนเมทริกซ์สามเหลี่ยมด้านบนเกี่ยวกับเส้นทแยงมุม ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก


person Clade    schedule 23.09.2019    source แหล่งที่มา


คำตอบ (1)


ในกรณีของคุณ

s=df.pivot(*df.columns)**2
s=s.fillna(s.T)

Out[230]: 
factor2     A      B      C
factor1                    
A        1.44   1.00   4.00
B        1.00  11.56  16.00
C        4.00  16.00  38.44
person BENY    schedule 23.09.2019
comment
เร็วกว่าอย่างเห็นได้ชัด—ขอบคุณ! ฉันขอถามได้ไหมว่าเครื่องหมายดอกจันก่อนหน้า df.columns ทำอะไร - person Clade; 23.09.2019
comment
@Clade ที่ได้รับชื่อคอลัมน์เพื่อแสดงรายการและส่งข้อมูลเหล่านั้นเพื่อหมุนเป็นค่าคอลัมน์ดัชนี - person BENY; 23.09.2019