我有一个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
在这些大小下似乎效率不高。有没有办法优化/矢量化上面的代码?
答案 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