在熊猫数据框列中的元组中拆分字符串

时间:2019-01-23 09:30:07

标签: python pandas vectorization

我有一个pandas数据框,其中一列包含元组:

p = pd.DataFrame({"sentence" : [("A.Hi",   "B.My",   "C.Friend"), \
                                ("AA.How", "BB.Are", "CC.You")]})

我想在标点符号.上拆分元组中的每个字符串,使用split / string的第二部分,看看有多少匹配的字符串列表:

p["tmp"] = p["sentence"].apply(lambda x: [i.split(".")[1] for i in x])
p["tmp"].apply(lambda x: [True if len(set(x).intersection(set(["Hi", "My"])))>0 else False])

这可以按预期工作,但是我的数据框有超过10万行-并且apply在这些大小下似乎效率不高。有没有办法优化/矢量化上面的代码?

1 个答案:

答案 0 :(得分:1)

使用嵌套列表并设置理解力,并将测试转换集设置为bool-空的set返回False

s = set(["Hi", "My"])
p["tmp"] = [bool(set(i.split(".")[1] for i in x).intersection(s)) for x in p["sentence"]]

print (p)
                   sentence    tmp
0    (A.Hi, B.My, C.Friend)   True
1  (AA.How, BB.Are, CC.You)  False

编辑:

如果分割后只有1个或2个长度值,则可以通过索引[-1]选择最后一个值:

p = pd.DataFrame({"sentence" : [("A.Hi",   "B.My",   "C.Friend"), \
                                ("AA.How", "BB.Are", "You")]})

print (p)
                 sentence
0  (A.Hi, B.My, C.Friend)
1   (AA.How, BB.Are, You)

s = set(["Hi", "My"])

p["tmp"] = [bool(set(i.split(".")[-1] for i in x).intersection(s)) for x in p["sentence"]]
print (p)
                 sentence    tmp
0  (A.Hi, B.My, C.Friend)   True
1   (AA.How, BB.Are, You)  False