【问题标题】:Iterate over values in pandas column containing lists and retrieve only unique values遍历包含列表的 pandas 列中的值并仅检索唯一值
【发布时间】:2014-02-11 13:10:57
【问题描述】:

这三个问题我只是想不通,希望有人能帮助我。

import pandas as pd
data = {'Col1': ['ONE, ONE, NULL', 'ONE, TWO, THREE', 'TWO, NULL, TEN']}
index = pd.Index(['d1','d2','d3'])
data = pd.DataFrame(data,index=index)
pattern = 'ONE|TWO'                 <----QUESTION1
data['Col1'].str.findall(pattern)   <----QUESTION2

问题 1:如何更改此正则表达式,以便在 d1 中仅找到一次“ONE”?现在,每个找到的 ONE 实例都将返回,如下所示。

d1    [ONE, ONE]
d2    [ONE, TWO]
d3         [TWO]

我想要这个

d1         [ONE]
d2    [ONE, TWO]
d3         [TWO]

问题 2:
我想将列表 d1、d2 和 d3 放入一个仅包含唯一值的列表。是这样的:

set(d1 + d2 + d3) ---> ['ONE', 'TWO']


问题 3:
如果我会做这样的事情:

data['Col2'] = data['Col1'].str.findall(pattern)

如何遍历 Col2 中的每一行以获得与我在 Question2 中要求的结果相同的结果?

【问题讨论】:

    标签: python regex pandas


    【解决方案1】:

    你可以使用reduce(over set.union):

    In [11]: reduce(set.union, data['Col1'].str.findall(pattern), set())
    Out[11]: {'ONE', 'TWO'}
    

    另一种选择是使用列表推导:

    In [12]: [w for w in ['ONE', 'TWO'] if data['Col1'].str.contains(w).any()]
    Out[12]: ['ONE', 'TWO']
    

    【讨论】:

    • 完美解决了问题2,谢谢!我将如何继续从熊猫表中提取列表?我想为 Col2 中的每一行创建一个新列表,创建的列表应具有 Col2 中所示的形状。
    • @user3139545 我不确定你要的是什么:s FWIW pandas 的经验法则是避免在 DataFrame / Series 中使用列表,通常有更好的方法。
    • 在 Col2 中,我将有一个看起来像这样的字符串 ['ONE', 'TWO', 'THREE'] 现在我想为每一行读取这个字符串并将其放入 python 列表中。
    • 我还没有找到更好的方法,数据框中的列表包含另一个框架中与该框架中的行相关的实例的 ID。
    • 目标是从 Col2 的所有列表中创建一个索引对象,以便仅从另一个数据帧中选择相关的 ID。
    【解决方案2】:

    问题 1 试试这个:data['Col1'].str.findall(pattern).apply(set)

    问题 2,3 试试这个:{x for s in data['Col1'].str.findall(pattern).apply(set) for x in s}

    【讨论】:

    • 这会存储带有 set() 文本的值。所以对于 d1,Col2 会说 set([ONE]),我可以不这样做而只得到 [ONE] 吗?
    • 对于 question3 我不想使用 Col1,我想创建列表,因为它们显示在 Col2 中。
    猜你喜欢
    • 2021-09-15
    • 2014-01-07
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多