[英]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.