簡體   English   中英

添加用於匹配列和行名稱的值

[英]Add values for matching column and row names

我正在思考如何最佳實施,這是一個簡短的問題。 我正在生成一個矩陣,用於累加在該列表的大量排列中,一個列表中兩個相鄰項被找到的次數。 我的代碼如下所示:

agreement_matrix = pandas.DataFrame(0, index=names, columns=names)
for list in bunch_of_lists:
    for i in range(len(list)-1):
        agreement_matrix[list[i]][list[i+1]] += 1

它生成一個類似的數組:

    A   B   C   D
A   0   2   1   1
B   2   0   1   1
C   1   1   0   2
D   1   1   2   0

而且因為我不太在乎順序,所以我想累加值,就像這樣:

    A   B   C   D
A   0   4   2   2
B   0   0   2   2
C   0   0   0   4
D   0   0   0   0

是否有任何快速/簡單的方法來實現這一目標? 我一直在嘗試在生成后進行操作,並嘗試在添加值時進行操作。

使用np.tri*

np.triu(df) + np.tril(df).T

array([[0, 4, 2, 2],
       [0, 0, 2, 2],
       [0, 0, 0, 4],
       [0, 0, 0, 0]])

調用DataFrame構造函數:

pd.DataFrame(np.triu(df) + np.tril(df).T, df.index, df.columns)

   A  B  C  D
A  0  4  2  2
B  0  0  2  2
C  0  0  0  4
D  0  0  0  0

避免第一個循環的熊貓解決方案:

values=['ABCD'[i] for i in np.random.randint(0,4,100)] # data

df=pd.DataFrame(values)
df[1]=df[0].shift()
df=df.iloc[1:]
df.values.sort(axis=1)
df[2]=1

res=df.pivot_table(2,0,1,np.sum,0)
#
#1  A   B   C   D
#0               
#A  2  14  11  16
#B  0   5   9  13
#C  0   0  10  17
#D  0   0   0   2

解決問題..

np.triu(df.values*2)#df.values.T+df.values
Out[595]: 
array([[0, 4, 2, 2],
       [0, 0, 2, 2],
       [0, 0, 0, 4],
       [0, 0, 0, 0]], dtype=int64)

那你做

pd.DataFrame(np.triu(df.values*2), df.index, df.columns)
Out[600]: 
   A  B  C  D
A  0  4  2  2
B  0  0  2  2
C  0  0  0  4
D  0  0  0  0

暫無
暫無

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

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