创建二进制熊猫数据框(针对的优化循环)

时间:2018-11-17 22:39:32

标签: python pandas list loops optimization

想象一下我有这个数据框:

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

此DataFrame:

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

(实际上,我有一个约13000行的数据框)

cit列是ID(单向)的链接,ID#0具有ID#6和ID#7的链接,ID#1没有链接,ID#4具有#9,#2的链接#1和ID#3的链接具有ID#0和ID#1

如果有链接,如果要链接2个id,我想输入1,否则为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循环。 我想优化以下代码:

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循环来完成此操作,但是使用13000行进行4个for循环,这将非常慢。)

我检查了iterrows()和itertuples()函数,但不知道该怎么做,与isin()或apply / map()函数相同。.

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我将创建一个新的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

如果需要,您可以在以后重新索引以获取所有行或所有列。但是,由于您的预期输出与您提供的数据不匹配,因此不确定是否需要。