Получить матрицу количества «периодов» со значениями, отличными от na, между всеми парами столбцов (общее количество) - PullRequest
0 голосов
/ 04 мая 2020

Pandas имеет функции .corr() и .cov(), которые генерируют матрицы корреляции и ковариационные матрицы соответственно. Можно передать min_periods=<some int> любому из них, чтобы получить NaN в качестве корреляции или ковариации для любой пары столбцов, в которой слишком мало строк со значениями, отличными от нан в обоих столбцах. Я ищу лучший способ создать матрицу, которая дает фактическое число общих значений non-nan numberri c для всех пар столбцов.

Например:

Настройка

pd.np.random.seed(42)
df = pd.DataFrame(pd.np.random.randn(20, 3),
                  columns=['a', 'b', 'c'])
df.loc[df.index[:5], 'a'] = pd.np.nan
df.loc[df.index[5:10], 'b'] = pd.np.nan

Я хочу получить countts_df, например:

    a   b   c
a  15  10  15
b  10  15  15
c  15  15  20

Я могу сделать это с помощью следующий код:

counts = []
for i in df.columns:
    for j in df.columns:
        counts.append((i, j, df[[i, j]].dropna().count().iloc[0]))
counts_df = pd.DataFrame(counts, columns=['i', 'j', 'count']).set_index(['i', 'j']).unstack()

Само собой разумеется, что код выполняет работу, по крайней мере, вдвое больше, чем нужно, но это не главное. Это, вероятно, не очень хорошее решение для начала. Код работает очень медленно для больших наборов данных (1000+ столбцов и 100 строк), даже если .corr() запускается в экземпляре в том же фрейме. Я не очень удивлен, что это так, однако я не смог придумать, как заставить pandas генерировать «матрицу счета». Каким был бы умный / хороший / чистый / быстрый способ создать такую ​​матрицу подсчета с pandas? Наверное, есть что-то встроенное, о чем я просто не подумала ...

1 Ответ

0 голосов
/ 04 мая 2020
>>> tmp = df.notna().astype(int)
>>> counts_df = tmp.T.dot(tmp)
>>> counts_df
    a   b   c
a  15  10  15
b  10  15  15
c  15  15  20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...