假设 dataFrame
:
df = pd.DataFrame({
'column_1': ['Apple', 'Apple Apple', 'Apple Apple', 'Peach Peach', 'Banana', 'Banana Banana'],
'column_2': ['Some value', 'Some value', 'Some value', 'Some value', 'Some value', 'Some value']
})
给出:
column_1 column_2
0 Apple Some value
1 Apple Apple Some value
2 Apple Apple Some value
3 Peach Peach Some value
4 Banana Some value
5 Banana Banana Some value
如何过滤行(重新分配 df
)以仅包含子字符串 'Apple'
或 'Banana'
的行在 column_1
的每个单元格的每个字符串中出现不止一次?
请注意,我想将过滤器指定为仅查找多次出现的 'Apple'
和 'Banana'
(不是以编程方式查找所有多次出现的不应包含任何子字符串,例如 'Peach Peach'
)。
即过滤应该导致:
column_1 column_2
1 Apple Apple Some value
2 Apple Apple Some value
5 Banana Banana Some value
最佳答案
检查以下答案(保留 Apple_Banana_count 列以进行完整性检查):
import pandas as pd
import re
df = pd.DataFrame({
'column_1': ['Apple', 'Apple Apple', 'Apple Apple', 'Peach Peach', 'Banana', 'Banana Banana'],
'column_2': ['Some value', 'Some value', 'Some value', 'Some value', 'Some value', 'Some value']
})
df.assign(Apple_Banana_count = df['column_1'].apply(lambda x: len([m.start() for m in re.finditer('Apple|Banana', x)]))).\
query('Apple_Banana_count > 1')
输出:
根据 Op 的评论更新了代码 - 未过滤以进行 Sense Check(您可以过滤这些列以获得所需的结果):
import pandas as pd
df = pd.DataFrame({
'column_1': ['Apple', 'Apple Apple', 'Apple Apple', 'Peach Peach', 'Banana', 'Banana Banana', 'Apple Banana','Banana blash blah Apple '],
'column_2': ['Some value', 'Some value', 'Some value', 'Some value', 'Some value', 'Some value', 'Some value', 'Some value']
})
df.assign(Apple_Banana_count = df['column_1'].apply(lambda x: len([m.start() for m in re.finditer('Apple|Banana', x)])),
Apple_and_Banana= df['column_1'].apply(lambda x: len([m.start() for m in re.finditer('(?=.*Apple)(?=.*Banana)', x)]))
)
输出:
关于python - Pandas :按列单元格中特定子字符串的多次出现过滤行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73222056/