如何解决Python DF 问题根据列值匹配
我有一个很大的 DF。如下所示的片段。
SrNo | Merchant | Revenue | Currency
1 | UBER SR | 123 | INR
2 | UBER (SR)| 123 | INR
3 | SR UBER | 123 | INR
4 | ZOMATO SR| 123 | INR
5 | ZOMATOSR | 123 | INR
6 |12FLIPAKRT| 123 | INR
7 | FLIPKART | 123 | INR
我的输出应该是这样的:
SrNo | Merchant | Revenue | Currency |Merchant_Flag
1 | UBER SR | 123 | INR | UBER
2 | UBER (SR)| 123 | INR | UBER
3 | SR UBER | 123 | INR | UBER
4 | ZOMATO SR| 123 | INR | ZOMATO
5 | ZOMATOSR | 123 | INR | ZOMATO
6 |12FLIPAKRT| 123 | INR | FLIPKART
7 | FLIPKART | 123 | INR | FLIPKART
说明:我想添加一个附加列,该列应具有与 Merchant 列对应的值,即如果 Merchant 列的值中包含 UBER,则 Merchant_Flag 应为 UBER,对于其他 ZOMATO、FLIPKART 也是如此。
我的数据集很大。我尝试使用 re.search 然后使用 if 和 else 替换我的条件,这给了我性能问题。 另一个解决方案,我试过使用 .loc
df.loc[df['columnname'].str.contains('')]
。不知道如何继续。有人可以帮忙吗。
解决方法
如果您知道可能存在哪些商家,那么您可以使用以下方法:
merchants = ['UBER','ZOMATO','FLIPKART']
for merchant in merchants:
df.loc[df["Merchant"].str.contains(merchant),"Merchant_Flag"] = merchant
,
我会使用 pandas.DataFrame.applymap
方法,在对对象执行迭代操作而不是编写简单的 for/while 时,使用内置方法在性能方面总是(作为经验法则)更好在python中循环。这样您就可以避免多次调用 pandas.DataFrame.loc
访问器的开销。
import re # import regex matching
df = pd.DataFrame({"Merchant":["UBER SR","SR UBER","ZOMATO SR","12FLIPKART"]})
# Use applymap to quickly iterate over the whole dataframe
df["Merchant_Flag"] = df.applymap(lambda x: re.search(r"UBER|ZOMATO|FLIPKART",x).group(0))
(注意: .group(0)
用于选择 re.search
的第一个匹配项)
输出:
Merchant Merchant_Flag
0 UBER SR UBER
1 SR UBER UBER
2 ZOMATO SR ZOMATO
3 12FLIPKART FLIPKART
编辑
如果您不知道所有商家的名称,则需要稍微修改传递给 applymap
的函数:
import re # import regex matching
# Function definition
def match_merchant(elem,reg):
# Match
m = re.search(reg,elem)
if m != None:
# Return first match if we got a match
return m.group(0)
else:
# Here you may specify exactly what it is you want to return: None,empty String...
return None
df = pd.DataFrame({"Merchant":["UBER SR","12FLIPKART","CABIFY"]})
# Merchants you want to match
regex = r"UBER|ZOMATO|FLIPKART"
# Use applymap to quickly iterate over the whole dataframe
df["Merchant_Flag"] = df.applymap(lambda x: match_merchant(x,regex))
输出:
Merchant Merchant_Flag
0 UBER SR UBER
1 SR UBER UBER
2 ZOMATO SR ZOMATO
3 12FLIPKART FLIPKART
4 CABIFY None
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。