查看Python Pandas相关矩阵条目的常见观察计数的快速方法

ely*_*ely 6 python numpy missing-data pandas

假设我有一个pandas.DataFramedf.df表示不同个体和索引轴的列表示时间,因此(i,j)条目是对时间段i的单独j观察,并且我们可以假设所有数据都是float可能具有NaN值的类型.

就我而言,我有大约14,000列和几百行.

pandas.corr 将给我回到14,000×14,000相关矩阵,它的时间性能对我的应用程序来说很好.

但我还想知道,对于每对个体(j_1,j_2),有多少非空观察进入相关计算,因此我可以隔离数据覆盖率较差的相关单元.

我能想出的最好成绩如下:

not_null_locations = pandas.notnull(df).values.astype(int)
common_obs = pandas.DataFrame(not_null_locations.T.dot(not_null_locations),
                              columns=df.columns, index=df.columns)
Run Code Online (Sandbox Code Playgroud)

内存占用和速度开始有点问题.

有没有更快的方法来获得共同观察pandas

Jef*_*eff 3

你可以这样做,但需要进行cythonize(否则会慢得多);然而内存占用应该更好(这给出了 nan 观察值的数量,您给出了有效观察值的数量,但很容易转换)

l = len(df.columns)
results = np.zeros((l,l))
mask = pd.isnull(df)
for i, ac in enumerate(df):
    for j, bc in enumerate(df):
           results[j,i] = (mask[i] & mask[j]).sum()
results = DataFrame(results,index=df.columns,columns=df.columns)
Run Code Online (Sandbox Code Playgroud)