我正在尝试编写一个脚本,该脚本检查DataFrame的一列是否每个值都不是另一个值的子字符串,并且不等于另一个列。我编写了遍历迭代的代码,并为每行返回其他子字符串值。一个例子:
df = pd.DataFrame({'names': ['Bob', 'Sam', 'Tom', 'Bob'], 'value': ['abc', 'ab', 'de', 'ab']})
>>> df
names value
0 Bob abc
1 Sam ab
2 Tom de
3 Bob ab
substring_df = pd.DataFrame(columns=df.columns)
for index, row in df.iterrows():
value = row["value"]
name = row["names"]
delta = df[df['value'].str.contains(value) & df['names'] == name]
if(len(delta.index) > 1):
substring_df = pd.concat([substring_df, delta])
>>> substring_df
names value
0 Bob abc
3 Bob ab
此代码可以正常工作,但是处理大量数据的速度非常慢。在包含10,000行的DataFrame上运行它需要2分钟的返回时间,我需要在更大的数据上运行它。
关于如何使此代码更高效的任何想法?
答案 0 :(得分:0)
将GroupBy.transform
与生成器一起使用,找到包含in
的子字符串并按boolean indexing
过滤组:
df = pd.DataFrame({"names": ["Bob", "Bob", "Bob", "Alice"], "value": ["abc", "ab", "d", "a"]})
print (df)
names value
0 Bob abc
1 Bob ab
2 Bob d
3 Alice a
f = lambda x: x.isin([w for y in x for z in x if z != y and z in y for w in (z, y)])
df = df[df.groupby('names')['value'].transform(f)]
print (df)
names value
0 Bob abc
1 Bob ab