Python 测向问题。根据列值匹配

Python DF issue. Match on the basis of column value

我有一个相当大的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 然后 .replace 使用 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)用于select 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",
                               "SR UBER",
                               "ZOMATO 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