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

示例 DF:

我有一个 df 列,如ZoneNew_ZoneCountryNew_Region&Currency

Currency列具有像EURAUDBLR, 之类的值RUB

Zone列的值类似于EUAfrica,NAZ

New_Zone具有像EUEuropeEUROPEAfricaNAZ, 的值AFRICA

Country具有像AustraliaBrazilRussiaUkraine, 之类的值USA

New_Region具有像AustraliaBrazil, 的值USA

因此,列ZoneNew_Zone包含几乎相似的值New_RegionCountry几乎相似的值

问:

我想创建一个Currency_Match具有以下条件的新列:

  1. 如果 Zone 是 EU OR (logical) New_Zone 是 EU, Europe 或 EUROPE AND (logical)CurrencyEUR那么 Yes else No

  2. 如果 Country 是 Australia OR(逻辑)New_Region 是 Austraila AND(逻辑)Currency 是AUDYes else No

  3. 如果 Country 是巴西OR(逻辑)New_Region 是巴西AND(逻辑)货币BLR则是 Yes else No

  4. 如果国家是韩国OR(逻辑)New_Region 是韩国AND(逻辑)货币KRW则是 Yes else No

  5. 如果 Zone 是 Africa OR(逻辑)New_Zone 是 Africa 或 AFRICA,AND(逻辑)CurrencyNGN则是 Yes else No

6 如果 Zone 是 NAZ OR(逻辑)New_Zone 是 NAZ,AND(逻辑)CurrencyUSD则是 Yes else No

7 如果国家是俄罗斯,乌克兰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)



问题:

上面的代码运行良好,但是当我编写这样的其他条件时,它会一次又一次地更新列。

他们有没有其他方法可以做到这一点,而且比这更不麻烦


HUWWW
浏览 147回答 1
1回答

慕森卡

创建用于可读代码,链由单独的行,每行的条件|或&按位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 dictd1 = {'EUR':['Europe','EUROPE','EU'],'NGN':['Africa','AFRICA'],'USD':['NAZ']}#region dictd2 = {'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')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python