Создайте двоичный файл данных панд (оптимизируйте цикл для) - PullRequest
0 голосов
/ 18 ноября 2018

Представьте, что у меня есть этот фрейм данных:

test = pd.DataFrame({"id" : [0,1,4,3],
                "cit" : [[6,7], [], [9,2,1], [0,1]]})

Этот фрейм данных:

       id   cit
   0    0   [6, 7]
   1    1   []
   2    4   [9, 2, 1]
   3    3   [0, 1]

(на самом деле у меня есть фрейм данных с ~ 13 000 строк)

Столбцы cit - это ссылки для идентификатора (в одну сторону), идентификатор № 0 имеет ссылки с идентификатором № 6 и № 7, идентификатор № 1 не имеет ссылки, идентификатор № 4 имеет ссылки с № 9, # 2 и # 1 и id # 3 имеют ссылки с id # 0 и id # 1

, если есть ссылка, я хочу поставить 1, если 2 id связаны, иначе 0

Я хочу получить такой вывод:

id  0   1   4   3
0   X   0   0   1
1   0   X   1   1
4   1   1   X   0
3   1   0   0   X

Я написал код, но с 2 для циклов .. Я хочу оптимизировать следующий код:

for i in range(len(test.id)):
   tmp = []
   for j in range(len(test.cit)):
     if test.id.iloc[i] in test.cit.iloc[j]:
        tmp.append(str(1))
     else:
        tmp.append(str(0))
   t2.loc[str(test.id.iloc[i])] = tmp
   print(i, '/' , len(test.id))
t2.values[[np.arange(len(test.id))]*2] = "X"

И я нене знаю, как скопировать верхний треугольник в нижний треугольник для DataFrame (я могу сделать это для цикла for, но для циклов 4 с 13 000 строками, это будет очень медленно ..)

Я проверил iterrows () и функции itertuples (), но я понятия не имею, как я могу это сделать, то же самое для функций isin () или apply / map ().

Заранее благодарен за помощь.

1 Ответ

0 голосов
/ 18 ноября 2018

Я бы создал новый DataFrame, а затем вы можете использовать pd.crosstab

import pandas as pd

df = (pd.DataFrame(test.cit.values.tolist(), 
                   index = test.id)
        .stack()
        .reset_index(level=1, drop=True)
        .to_frame())

pd.crosstab(df.index, df[0].values.astype(int)).rename_axis(None,1).rename_axis('id', 0)

Вывод:

    0  1  2  6  7  9
id                  
0   0  0  0  1  1  0
3   1  1  0  0  0  0
4   0  1  1  0  0  1

При необходимости вы можете переиндексироватьзатем, чтобы затем получить все строки или все столбцы.Но так как ожидаемый результат не соответствовал предоставленным вами данным, не уверен, что это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...