Pandas。在其他列上应用字符串条件的基础上创建一个列[英] Pandas: Create a column based on applying string conditions on other column

本文是小编为大家收集整理的关于Pandas。在其他列上应用字符串条件的基础上创建一个列的处理方法,想解了Pandas。在其他列上应用字符串条件的基础上创建一个列的问题怎么解决?Pandas。在其他列上应用字符串条件的基础上创建一个列问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我有一个数据框 df 如下:

    KPI             Tata    JSW 
Gross Margin %      0.582   0.476   
EBITDA Margin %     0.191   0.23    
EBIT Margin %       0.145   0.183   
SG&A/Revenue        0.141   0.03    
COGS/Revenue        0.418   0.524   
CapE/Revenue        0.0577  0.1204      
ROA                 0.064   0.093   
ROE                 0.138   0.243       
Revenue/Employee $K 290.9   934.4   
Inventory Turnover  2.2     3.27    
AR Turnover         13.02   14.29   
Tot Asset Turnover  0.68    0.74    
Current Ratio       0.9     0.8 
Quick Ratio         0.3     0.4 

我正在尝试根据以下标准添加一列,例如 scope:

if df[df['KPI'].str.contains('Margin|Revenue|ROE|ROA')].shape[0] > 0:
  z = 'Max'
elif df[df['KPI'].str.contains('Quick|Current|Turnover')].shape[0] > 0:
  z = 'Min'

换句话说,如果字段 KPI 包含像 Revenue 或 Margin 这样的任何单词,那么列 scope 应该采用 Max 否则 Min.现在 KPI == COGS/Revenue 或 KPI == CapEx/Revenue 中有一个例外.在这种情况下,尽管存在字符串 Revenue,但 scope 应该采用 Min.

所以结果 df 应该如下所示:

结果数据框

为了达到同样的效果,我试图在 KPI 字段上使用 apply 一个函数.

def scope_superlative(col_name):
  df_test = df[df[col_name].str.contains('Margin| Revenue|ROA|ROE')]
  if df_test.shape[0] > 0:
    z = 'Max'
  else:
    df_test = df[df[col_name].str.contains('/Revenue|Current|Quick|Turnover')] ##<-- I want to check if string 'Revenue' is in denominator.##
    if df_test.shape[0] > 0:
      z='Min'
  return z
##Applying this function##
df['scope'] = df.KPI.apply(lambda x : scope_superlative(x))

上面的代码生成一个 Error 作为 KeyError: 'Gross Margin %

如果我使用 df['scope']=df.apply(scope_superlative('KPI'), axis=1),我会得到一个错误为 AttributeError: 'DataFrame' object has no attribute 'Max'.

有人可以帮忙吗?功能或应用技术有什么问题吗?

推荐答案

我想你正在寻找这样的东西:

import pandas as pd
import re

def fn(row):
    if re.search('/Revenue|Current|Quick|Turnover', row['KPI']):
        return 'Min'
    elif re.search('Margin|Revenue|ROA|ROE', row['KPI']):
        return 'Max'

df = pd.read_csv('so.csv')

df['scope'] = df.apply (lambda row: fn(row), axis=1)
print (df)

这只是使用 df.apply() 函数,它获取每一行并在其上应用提供的函数.

这给出了给定数据的以下结果:

0        Gross Margin %    0.5820    0.4760   Max
1       EBITDA Margin %    0.1910    0.2300   Max
2         EBIT Margin %    0.1450    0.1830   Max
3          SG&A/Revenue    0.1410    0.0300   Min
4          COGS/Revenue    0.4180    0.5240   Min
5          CapE/Revenue    0.0577    0.1204   Min
6                   ROA    0.0640    0.0930   Max
7                   ROE    0.1380    0.2430   Max
8   Revenue/Employee $K  290.9000  934.4000   Max
9    Inventory Turnover    2.2000    3.2700   Min
10          AR Turnover   13.0200   14.2900   Min
11   Tot Asset Turnover    0.6800    0.7400   Min
12        Current Ratio    0.9000    0.8000   Min
13          Quick Ratio    0.3000    0.4000   Min

希望这会有所帮助!

本文地址:https://www.itbaoku.cn/post/1728208.html