簡體   English   中英

從兩列創建矩陣

[英]Create a matrix from two columns

我正在嘗試從 excel 表中的兩列創建一個矩陣。 第一列是具有多個重復實例的鍵,第二列引用與鍵相關的不同值。 我希望能夠創建第二列中所有值的矩陣,以引用它們為所有關鍵實例配對的次數。

   a                b
   1               red
   1               blue
   1               green
   2               yellow
   2               red
   3               blue
   3               green
   3               yellow

我想把這個樣本 dataframe 變成

color      red   blue   yellow   green
red         0      1       1       1
blue        1      0       1       2
yellow      1      1       0       1
green       1      2       1       0 

基本上使用列 a 作為 groupby() 來分割每個鍵,然后將遇到的關系計數為運行計數。 不太清楚如何實現 pivot 表或交叉表來完成此操作(如果這甚至是最好的路線)。

import numpy as np
import pandas as pd


s = pd.crosstab(df.a, df.b)  # crosstabulate
s = s.T @ s  # transpose and take dot product
np.fill_diagonal(s.values, 0)  # Fill the diagonals with 0

print(s)

b       blue  green  red  yellow
b                               
blue       0      2    1       1
green      2      0    1       1
red        1      1    0       1
yellow     1      1    1       0

這看起來像一個外部連接,所以我選擇了它:

df = pd.DataFrame( {'a': [1,1,1,2,2,3,3,3],
                    'b':['red', 'blue', 'green', 'yellow', 'red', 'blue', 'green', 'yellow']})

df_count = df.merge(df, on = 'a').groupby(['b_x', 'b_y']).count().reset_index().pivot(index = 'b_x', columns='b_y', values='a')
np.fill_diagonal(df_count.values, 0)

df_count.index.name='color'
df_count.columns.name=None
        blue    green   red yellow
color               
blue    0   2   1   1
green   2   0   1   1
red     1   1   0   1
yellow  1   1   1   0

使用how='crosstab'作為pd.merge的參數。 我假設您沒有像兩個(1,紅色)這樣的('a','b')重復項。

out = (
  pd.merge(df, df, how='cross').query('a_x == a_y & b_x != b_y')[['b_x', 'b_y']] \
    .assign(dummy=1).pivot_table('dummy', 'b_x', 'b_y', 'count', fill_value=0) \
    .rename_axis(index=None, columns=None)
)
print(out)

# Output:
        blue  green  red  yellow
blue       0      2    1       1
green      2      0    1       1
red        1      1    0       1
yellow     1      1    1       0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM