根据熊猫中其他两列的条件使用创建列

Chetanya Saxena

我想根据其他两列的条件在熊猫中创建一列。我在for循环中尝试if条件,但是在检查字符串值时出错。

我的数据框:

df=pd.DataFrame({"Area:['USA','India','China','UK','France','Germany','USA','USA','India','Germany'],
         "Sales":[2,3,7,1,4,3,5,6,9,10]})

我想根据条件创建一列RATING:

如果国家/地区在ASIA中且销售额> 2,则1

如果国家/地区在NA中且销售额> 3,则1

如果国家/地区是欧元,且销售额> = 4,则1否则0

我正在使用一个功能:

ASIA=['India','China']
NA= ['USA']   
EUR=['UK','France','Germany']     
def label_race(row):
 if row['Area'].isin(ASIA) & row['Sales'] >2  :
   return 1
 if row['Area'].isin(NA) & row['Sales'] >3  :
   return 1  
 if row['Area'].isin(EUR) & row['Sales'] >=4  :
   return 1
 return 0  

df['Rating']=df.apply(lambda row: label_race(row),axis=1) 

这引发以下错误:

AttributeError: ("'str' object has no attribute 'isin'", 'occurred at index 0')

请告诉我我在函数中做错了什么,或者以其他任何更简单的方式执行此操作。

耶斯列尔

使用向量化解决方案numpy.select

m = [df['Area'].isin(ASIA) & (df['Sales'] > 2), 
     df['Area'].isin(NA) & (df['Sales'] > 3), 
     df['Area'].isin(EUR) & (df['Sales'] >= 4)]
df['Rating'] = np.select(m, [1,1,1], default=0)

print (df)
      Area  Sales  Rating
0      USA      2       0
1    India      3       1
2    China      7       1
3       UK      1       0
4   France      4       1
5  Germany      3       0
6      USA      5       1
7      USA      6       1
8    India      9       1
9  Germany     10       1

您的解决方案应使用inand代替,isin进行更改&

def label_race(row):
 if row['Area'] in (ASIA) and row['Sales'] >2  :
   return 1
 if row['Area'] in (NA) and row['Sales'] >3  :
   return 1  
 if row['Area'] in (EUR) and row['Sales'] >=4  :
   return 1
 return 0  

df['Rating']=df.apply(lambda row: label_race(row),axis=1) 
print (df)
      Area  Sales  Rating
0      USA      2       0
1    India      3       1
2    China      7       1
3       UK      1       0
4   France      4       1
5  Germany      3       0
6      USA      5       1
7      USA      6       1
8    India      9       1
9  Germany     10       1

区别在于性能:

#[10000 rows x 3 columns]
df = pd.concat([df] * 1000, ignore_index=True)

In [216]: %timeit df['Rating1']=df.apply(lambda row: label_race(row),axis=1)
275 ms ± 11.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

In [217]: %timeit df['Rating'] = np.select(m, [1,1,1], default=0)
215 µs ± 3.46 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

我尝试从评论中检查@Anton vBR想法:

def label_race(row):
 if row['Area'] in (ASIA) and row['Sales'] >2  :
   return 1
 elif row['Area'] in (NA) and row['Sales'] >3  :
   return 1  
 elif row['Area'] in (EUR) and row['Sales'] >=4  :
   return 1
 else:
   return 0  

df['Rating1']=df.apply(lambda row: label_race(row),axis=1) 

In [223]: %timeit df['Rating1']=df.apply(lambda row: label_race(row),axis=1)
268 ms ± 2.43 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python:根据其他两列中的值有条件地创建新列

熊猫根据其他列的值创建新的列ID

根据其他列的条件在熊猫中创建新列

根据熊猫df中其他列的值有条件地填充列

根据熊猫中其他两个列的匹配值创建新列

根据其他两列替换熊猫中的值

根据字典创建一个以其他列为条件的熊猫列

根据熊猫中其他两列的比较更改列的值

根据其他列中的条件创建新列

根据其他列中的匹配单词创建熊猫列

根据其他两个数据框列中的值条件创建新列

熊猫根据其他列创建和填充新列

根据其他条件创建新列

根据其他数据框中的列值在熊猫数据框中创建列

熊猫使用其他列中的值创建新列,并根据列值进行选择

熊猫根据其他列中的条件和值创建新列

使用mutate和min_rank根据其他两列中的值创建排名列

根据条件在熊猫中创建新列

根据其他两列中的条件在R中创建一个新列

熊猫根据其他两列的划分创建新列

根据熊猫中其他两个列的比较将列设置为true / false?

根据其他列中的多个条件创建列值

根据熊猫数据框中其他列的条件和值创建新列

如何根据其他两列中的 IF AND 使用设定值创建新列

根据其他两列中的值创建是/否列

如何根据其他两列中的值在熊猫数据框中添加新列

熊猫,根据其他列创建“订单”列

如何根据其他两列中的条件创建和填充新列?

根据值在熊猫中创建条件列