gpt4 book ai didi

python - 使用 numpy/pandas 从两列创建一个联合命中数矩阵

转载 作者:行者123 更新时间:2023-11-28 21:20:49 25 4
gpt4 key购买 nike

我有 2 个大数据列(大约 150 万个值)。它们的结构如下:

     col1 = [2,2,1,4,5,4,3,4,4,4,5,2,3,1,1 ..] etc.,
col2 = [1,1,8,8,3,5,6,7,2,3,10.........] etc.,

我想制作一个联合计数矩阵 CountsMAT。 col1 的取值范围为 1 到 5,col2 的取值范围为 1 到 10。

     counts of [(1,2),(1,3),...(1,10),
(2,1), (2,2),....(2,10),
(3,1),......,(3,3)...(3,10),
...........................
(5,1),(5,2),...(5,5).....(5,10)] are required ie.,

a CountsMAT of size (5,10)
max(col1) = 5; max(col2) = 10 ;

我已经实现了一个带有 defaultdict 和 for 循环的版本,但这需要一段时间。我确信这可以直接用 Pandas 更熟练地处理,我很欣赏使用 numpy/pandas 的最佳实现。许多其他类似的查询指向 Pandas 的“groupby”,但我并不精通。

获取矩阵格式的输出对于我的基于字典的实现来说也比较棘手。但我猜 Pandas/numpy 会更容易。谢谢!

最佳答案

这可能有效(使用 numpy.histogram2d):

import numpy as np

col1 = np.random.random_integers(1, 5, 100)
col2 = np.random.random_integers(1, 10, 100)
bin1 = np.arange(0.5, 6.5, 1)
bin2 = np.arange(0.5, 11.5, 1)

mat = np.histogram2d(col1, col2, bins=[bin1, bin2])[0]
print mat.shape
print mat

产生

(5, 10)
array([[ 4., 2., 0., 6., 2., 2., 1., 2., 1., 2.],
[ 3., 3., 3., 0., 3., 0., 1., 4., 1., 0.],
[ 4., 2., 1., 1., 3., 2., 5., 2., 2., 2.],
[ 1., 1., 3., 2., 3., 1., 4., 4., 0., 0.],
[ 0., 2., 1., 4., 3., 1., 3., 2., 0., 1.]])

我没有使用长度超过几千的列表对其进行测试,但我认为它应该可以扩展到几百万个值。


编辑:

你好@nahsivar。我对 pandas 不太熟悉(但我应该很熟悉),所以我花了几分钟时间玩了一下。这里有几种方法可以得到你想要的东西(我认为):

#instantiate dataframe
import pandas as pd
from random import choice
x_choice = 'ABCDE'
y_choice = 'ABCDEFGHIJ'
x, y = [], []
for i in range(100):
x[i] = choice(x_choice)
y[i] = choice(y_choice)

df = pd.DataFrame(data={'col1': x, 'col2': y})

# 1
df.pivot_table(rows='col1', cols='col2', aggfunc=len)
# Use fill_value=0 to replace the NaNs with 0
# Output:
col2 A B C D E F G H I J
col1
A NaN 1 3 1 2 2 2 1 4 2
B 1 1 NaN 3 5 1 2 3 1 NaN
C 4 1 2 NaN NaN 4 3 2 1 2
D 2 2 2 1 1 3 3 4 4 2
E 1 1 1 NaN 4 2 6 3 2 2

# 2
df.groupby('col2')['col1'].value_counts().unstack(level=0)
# Output:
col2 A B C D E F G H I J
A NaN 1 3 1 2 2 2 1 4 2
B 1 1 NaN 3 5 1 2 3 1 NaN
C 4 1 2 NaN NaN 4 3 2 1 2
D 2 2 2 1 1 3 3 4 4 2
E 1 1 1 NaN 4 2 6 3 2 2

# 3
pd.crosstab(df.col1, df.col2)
# Output:
col2 A B C D E F G H I J
col1
A 0 1 3 1 2 2 2 1 4 2
B 1 1 0 3 5 1 2 3 1 0
C 4 1 2 0 0 4 3 2 1 2
D 2 2 2 1 1 3 3 4 4 2
E 1 1 1 0 4 2 6 3 2 2

关于python - 使用 numpy/pandas 从两列创建一个联合命中数矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22307971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com