【问题标题】:Filter Pandas Dataframe by number of list entries and rearrange output by pairs按列表条目数过滤 Pandas Dataframe 并按对重新排列输出
【发布时间】:2020-04-28 20:22:00
【问题描述】:

我正在使用格式如下的 csv 文件,该文件是通过使用 df.groupby 来过滤哪些 id 公开共享哪些链接而创建的。

 url        id
 bbc.com     ['183','194','101']
 cnn.com     ['182', '193', '103']
 google.com  ['131']

我现在正试图将其转换为一个新的 csv,每次两个 id 共享同一个链接时都会显示。

所以我的理想输出应该是这样的,特别是没有引号:

source target
183, 194
183, 101
194, 101
182, 193
182, 103
103, 193

非常感谢任何帮助!

我尝试从 df.drop 开始删除包含较少条目的行,但它将整个条目作为字符串读取,即 ['183, '194', '101'] 作为整个字符串而不是一个列表,所以我有点卡住了。

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    我猜你需要使用 itertools.combinations(x, k)。示例如下:

    import pandas as pd
    import numpy as np
    import itertools
    
    df = pd.DataFrame({ 'url': ['bbc.com', 'cnn.com', 'google.com'],
                  'id' : [['183','194','101'], ['182', '193', '103'], ['131']  ]})
    
    df
    
        url         id
    0   bbc.com     [183, 194, 101]
    1   cnn.com     [182, 193, 103]
    2   google.com  [131]
    

    这是产生输出的循环:

    k =2
    for x in df['id'].values:
        for a, b in itertools.combinations(x, k):
              print(a, b)
    

    输出:

     183 194
     183 101
     194 101
     182 193
     182 103
     193 103
    

    【讨论】:

    • 非常感谢您的帮助!这工作得很好。我意识到我最初遇到的问题是这崩溃了退出代码-9。在查找之后,它似乎意味着系统内存不足。因此,我现在正在研究一种将流程拆分为块的方法,因为此代码在较小的数据集上运行良好。
    猜你喜欢
    • 2018-01-02
    • 2018-02-14
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-29
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多