我有一个 pandas 数据框,其中一列包含元组:
p = pd.DataFrame({"sentence" : [("A.Hi", "B.My", "C.Friend"), \
("AA.How", "BB.Are", "CC.You")]})
我想按标点符号 拆分元组中的每个字符串。
,获取拆分/字符串的第二部分并查看有多少个匹配的字符串列表:
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])
这按预期工作,但我的数据框有超过 100k 行 - 并且 apply
在这些大小下似乎效率不高。有没有办法优化/矢量化上述代码?
最佳答案
使用嵌套列表和集合理解并进行测试,将集合转换为 bool
s - 空 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
关于python - 在 pandas 数据框列中拆分元组中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54323988/