为了账号安全,请及时绑定邮箱和手机立即绑定

创建具有多个匹配项的新列

创建具有多个匹配项的新列

HUWWW 2021-11-30 15:37:40
示例 DF:我有一个 df 列,如Zone, New_Zone, Country, New_Region&CurrencyCurrency列具有像EUR, AUD, BLR, 之类的值RUBZone列的值类似于EU, Africa,NAZNew_Zone具有像EU, Europe, EUROPE, Africa, NAZ, 的值AFRICACountry具有像Australia, Brazil, Russia, Ukraine, 之类的值USANew_Region具有像Australia, Brazil, 的值USA因此,列Zone和New_Zone包含几乎相似的值New_Region和Country几乎相似的值问:我想创建一个Currency_Match具有以下条件的新列:如果 Zone 是 EU OR (logical) New_Zone 是 EU, Europe 或 EUROPE AND (logical)CurrencyEUR那么 Yes else No如果 Country 是 Australia OR(逻辑)New_Region 是 Austraila AND(逻辑)Currency 是AUDYes else No如果 Country 是巴西OR(逻辑)New_Region 是巴西AND(逻辑)货币BLR则是 Yes else No如果国家是韩国OR(逻辑)New_Region 是韩国AND(逻辑)货币KRW则是 Yes else No如果 Zone 是 Africa OR(逻辑)New_Zone 是 Africa 或 AFRICA,AND(逻辑)CurrencyNGN则是 Yes else No6 如果 Zone 是 NAZ OR(逻辑)New_Zone 是 NAZ,AND(逻辑)CurrencyUSD则是 Yes else No7 如果国家是俄罗斯,乌克兰OR(逻辑)New_Region 是俄罗斯AND(逻辑)货币RUB则是 Yes else No我总共有 7 个条件,就像上面的这些代码:  df['Currency_Match']=df.apply(lambda row: "Yes" if (((row['Zone'] == "EU")|(row['New_Zone'] =='Europe')|(row['New_Zone'] =='EU')|(row['New_Zone'] =='EUROPE')) & (row["Contract - Original Currency Code"] == "EUR"))     else 'No',axis=1)问题:上面的代码运行良好,但是当我编写这样的其他条件时,它会一次又一次地更新列。他们有没有其他方法可以做到这一点,而且比这更不麻烦
查看完整描述

1 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

创建用于可读代码,链由单独的行,每行的条件|或&按位OR或AND对最终掩模和通到numpy.where:


m1 = (df['Zone'] == "EU")|(df['New_Zone'].isin(['Europe','EUROPE','EU'])

m2 = (df["Contract - Original Currency Code"] == "EUR")


m3 = (df['Region'] == "Australia")|(df['New_Region'] =='Australia')

m4 = (df["Contract - Original Currency Code"] == "AUD")


m5 = (df['Region'] == "Brazil")|(df['New_Region'] =='Brazil')

m6 = (df["Contract - Original Currency Code"] == "BLR")


mask = (m1 & m2) | (m3 & m4) | (m5 & m6)


df['Currency_Match'] = np.where(mask, "Yes", 'No')

编辑:对于动态解决方案,使用区域和区域列表按货币创建字典并传递给logical_or.reducein dict comprehension:


#zone dict

d1 = {'EUR':['Europe','EUROPE','EU'],'NGN':['Africa','AFRICA'],'USD':['NAZ']}


#region dict

d2 = {'AUD':['Australia'], 'BLR':['Brazil'],'KRW':['Korea'],'RUB':['Russia','Ukraine']}


m1 = [(df['Zone'].isin(v) | df['New_Zone'].isin(v)) & 

      (df["Contract - Original Currency Code"] == k) 

       for k, v in d1.items()]

print (m1)


m2 = [(df['Region'].isin(v) | df['New_Region'].isin(v)) & 

      (df["Contract - Original Currency Code"] == k) 

       for k, v in d2.items()]

print (m2)


mask = np.logical_or.reduce(m1) | np.logical_or.reduce(m2)


df['Currency_Match'] = np.where(mask, "Yes", 'No')


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信