【问题标题】:Create binary pandas dataframe (optimize loop for)创建二进制熊猫数据框(优化循环)
【发布时间】:2019-04-20 17:25:15
【问题描述】:

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

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 列是 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 循环来完成,但是 4 个 for 循环有 13 000 行,它会很慢..)

我检查了 iterrows() 和 itertuples() 函数,但我不知道该怎么做,isin() 或 apply/map() 函数也是如此。

提前感谢您的帮助。

【问题讨论】:

    标签: python pandas list loops optimization


    【解决方案1】:

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

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

    【讨论】:

    • 看起来不错!不知道有这样的功能,对于6,7和9,我忘了说有id不在id列中(因为预处理过滤器)
    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 2016-09-06
    • 1970-01-01
    • 2022-10-24
    • 2020-05-09
    • 2023-02-04
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多