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

2024-05-15 00:20:33 发布

您现在位置:Python中文网/ 问答频道 /正文

样品测向:

我有一个df,它的列有ZoneNew_ZoneCountryNew_Region&Currency

Currency列的值有EURAUDBLRRUB

Zone列的值类似于EUAfricaNAZ

New_Zone的值有EUEuropeEUROPEAfricaNAZAFRICA

Country的值有AustraliaBrazilRussiaUkraineUSA

New_Region的值类似于AustraliaBrazilUSA

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

询问:

我想用以下条件创建一个名为Currency_Match的新列:

  1. 如果区域是EU(逻辑)新区域是EU、Europe或Europe,并且(逻辑)货币是EUR,则是或否
  2. 如果国家是澳大利亚或新的地区是澳大利亚,货币是AUD,那么是或否
  3. 如果国家是巴西(逻辑)新的地区是巴西(逻辑)货币是BLR,则是或否
  4. 如果国家是韩国(逻辑)新的地区是韩国(逻辑)货币是KRW,则是或否

  5. 如果区域是非洲(逻辑)新区是非洲或非洲,(逻辑)货币是NGN,则是或否

6如果区域是NAZ(逻辑)新区域是NAZ,(逻辑)货币是USD,则是或否

7如果国家是俄罗斯,乌克兰(逻辑)新的地区是俄罗斯(逻辑)货币是RUB,则是或否

我一共有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)

问题:

上面的代码工作得很好,但是当我编写其他类似的条件时,它会一次又一次地更新列

他们有没有其他的方法我可以做到这一点,也没有这个麻烦


Tags: 区域zonedfnew货币逻辑国家country
1条回答
网友
1楼 · 发布于 2024-05-15 00:20:33

为可读代码的单独行创建每个条件,按|&逐位ORAND链接到最终掩码并传递到^{}

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')

编辑:对于动态解决方案,使用区域和区域列表按货币创建字典,并传递到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')

相关问题 更多 >

    热门问题