【问题标题】:Splitting a column value into list of values separated by comma将列值拆分为以逗号分隔的值列表
【发布时间】:2021-02-02 11:27:42
【问题描述】:

我正在尝试分离具有这样值的 pandas 数据框列 -

我的目标是为每个“约束”创建一个值列表,并将每个值放在单引号内。这应该是预期的输出 -

我已经尝试过 pandas groupby apply(list) 但它没有按预期工作。我希望得到一个正确的熊猫列表,其中每个值都包含在引号内,然后用逗号分隔,但是,它会生成以下输出(值用逗号分隔,但引号仅在第一个值之前和最后一个值之后)。

这是我的代码 -

grouped_targets = target_table.groupby(['user_id', 'target_type'])['constraints'].apply(set).apply(list).reset_index()
grouped_targets.head()

这是我的代码生成的输出-

我做错了什么?

【问题讨论】:

    标签: python python-3.x pandas list dataframe


    【解决方案1】:

    在扁平嵌套列表的列表推导中使用自定义 lambda 函数通过 , 拆分值,转换为集合并最后转换为列表:

    target_table = pd.DataFrame({'user_id':[1,2,1,2,1,2],
                                 'target_type':[2,8,2,8,8,8],
                                 'constraints':['aaa, dd','ss, op','ja, ss',
                                                'dd, su, per', 'a', 'uu, ss']})
    
    
    
    
    f = lambda x: list(set(["'" + z + "'" for y in x.str.split(', ') for z in y]))
    grouped_targets = (target_table.groupby(['user_id', 'target_type'])['constraints']
                                   .apply(f)          
                                   .reset_index())
    
    print (grouped_targets['constraints'].tolist())
    [["'ss'", "'aaa'", "'dd'", "'ja'"], ["'a'"], 
     ["'ss'", "'per'", "'uu'", "'su'", "'op'", "'dd'"]]
    

    f = lambda x: list(set([z for y in x.str.split(', ') for z in y]))
    grouped_targets = (target_table.groupby(['user_id', 'target_type'])['constraints']
                                   .apply(f)          
                                   .reset_index())
    
    print (grouped_targets['constraints'].tolist())
    [['ss', 'dd', 'aaa', 'ja'], ['a'], 
     ['ss', 'su', 'uu', 'per', 'op', 'dd']]
        
    

    编辑:

    我认为最复杂的是自定义函数,你可以在列表中测试它是如何工作的:

    L = ['aaa, dd','ss, op','ja, ss', 'dd, su, per', 'a', 'uu, ss']
    

    如果列表输出中只有拆分值不同,则获取列表列表(嵌套列表):

    a = [x.split(', ') for x in L]
    print (a)
    [['aaa', 'dd'], ['ss', 'op'], ['ja', 'ss'], ['dd', 'su', 'per'], ['a'], ['uu', 'ss']]
    

    flatten values 可以与 split 结合使用:

    a = [z for x in L for z in x.split(', ')]
    print (a)
    ['aaa', 'dd', 'ss', 'op', 'ja', 'ss', 'dd', 'su', 'per', 'a', 'uu', 'ss']
    

    【讨论】:

    • 这仍然给出类似于我的代码的输出 - 这些值用单引号合并 - 比如'a,b,c'。我想要“a”、“b”、“c”。
    • @lightyagami96 - 你能检查编辑的答案吗?
    • 您的编辑是有道理的,但我收到此错误 - AttributeError: 'Series' object has no attribute 'split'
    • @lightyagami96 - 已编辑答案,我认为您需要第二个解决方案。
    • 完美。你能帮我理解它是如何工作的吗?一个非常简短的解释?
    【解决方案2】:

    你应该可以通过拆分字符串来实现,所以:

    new_df = df['constraints'].apply(lambda x: x.split(', '))
    

    【讨论】:

      【解决方案3】:

      先尝试使用拆分。

      ... ].str.split(',').apply(list)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-10-06
        • 2018-09-25
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-22
        相关资源
        最近更新 更多