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
我有一个相当大的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