数据框索引上的熊猫交叉表

时间:2019-04-23 11:37:35

标签: python pandas dask

我有一个存储事务日志的数据框。每个日志都有自己的活动哈希值和相应的用户ID,例如

ID                  UserID
999974708546523127  AU896
999974708546523127  ZZ999
999974708546520000  ZZ999

我使用交叉表创建一个相关矩阵,以比较散列的用户活动。因此,我可以衡量他们的行为有多相似:

Data = pd.read_csv('path.csv', 
        sep=';', names=['ID', 'UserID', 'Info1', 'Info2'], error_bad_lines=False, 
        encoding='latin-1', dtype='category')

df = pd.crosstab(Data.UserID, Data.ID)

但是,由于我有大约500万行,并且ID活动哈希是如此复杂,因此计算所需的时间太长或根本无法完成。使用dtype = 'category'已经大大减少了csv文件的读取时间。

预期的输出相关矩阵

Index  AU896  ZZ999
AU896    1     0.5
ZZ999   0.5     1

我无法更改哈希或UserID来减少内存使用。

Info1和Info2的此操作分别需要6到3秒钟。

也许对熊猫甚至是黄昏者有更有效的操作吗?

谢谢您的帮助!

1 个答案:

答案 0 :(得分:0)

不确定用例。由于您没有显示如何处理info1info2列。所以我举一个一般的例子。

import pandas as pd
import io

data_string = '''ID,UserID,info1
999974708546523127,AU896,35
999974708546523127,ZZ999,45
999974708546520000,ZZ999,13
999974708546520000,AU896,13
999974708546523128,AU896,45
999974708546523128,ZZ999,12
999974708546520001,ZZ999,36
999974708546520001,AU896,37'''

df = pd.read_csv(io.StringIO(data_string))

# create a wide form of data from long
wide_df = df.pivot(index="ID", columns="UserID", values="info1").reset_index()
# build the correlation metrics from the wide form of data
corr_df = wide_df[["AU896", "ZZ999"]].corr()