尝试使用 apply 对 Panda DataFrame 中的不同键进行操作

问题描述

我有一个看起来像这样的 Panda DataFrame:

Using a single class:
<__main__.MyIterator object at 0x7f65a23b6fd0>
1
2
3

Separating the iterator class from the container class:
<__main__.Iterator object at 0x7f65a23b6ca0>
1
2
3

我想遍历每一行,检查“TOTAL_COVERAGE”的值,如果是“是”,则对其他值执行数学运算,即:

SELECT 
    * 
FROM 
    customer as c
INNER JOIN 
    salesman as s 
ON c.salesman_id = s.salesman_id;

但我收到错误df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'],'TOTAL_COVERAGE' : ['yes','yes','no'],'BEG_D' : ['1','1','500'],'END_D' : ['102','25','600'],'BEG_S' : ['1','1'],'END_S': ['102','458']}) 必须有一个我没有看到的简单修复。提前致谢!

解决方法

你可以不用 iterrowsapply,直接等价:

df['%'] = ''
df.loc[df['TOTAL_COVERAGE'] == 'yes','%'] = 
    df['END_S'].astype(int) * 100 / df['END_D'].astype(int)
,

您可以用矢量化方法解决它,不需要 iterrowsapply

df['%'] = (df['END_S'].astype(int) * 100 / df['END_D'].astype(int)) \
            .where(df['TOTAL_COVERAGE'] == 'yes')

df

#       ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S      %
#0  O60829            yes     1   102     1   102  100.0
#1  O60341            yes     1    25     1    25  100.0
#2  Q9H1R3             no   500   600     1   458    NaN

您得到 keyError 的原因是因为当您使用 apply 时,lambda x 的参数是一列(pandas 系列),不能用于访问特定列顾名思义。

,

无需执行 iterrows()。可以使用 numpy.where() 完成条件逻辑以提供更有效的解决方案

df = pd.DataFrame({'ID' : ['O60829','O60341','Q9H1R3'],'TOTAL_COVERAGE' : ['yes','yes','no'],'BEG_D' : ['1','1','500'],'END_D' : ['102','25','600'],'BEG_S' : ['1','1'],'END_S': ['102','458']})
df = (df
 .assign(pct=lambda x: np.where(x["TOTAL_COVERAGE"].eq("yes"),(x['END_S'].astype(int)*100)/x['END_D'].astype(int),np.nan))
 .rename(columns={"pct":"%"})
)

输出

     ID TOTAL_COVERAGE BEG_D END_D BEG_S END_S      %
 O60829            yes     1   102     1   102  100.0
 O60341            yes     1    25     1    25  100.0
 Q9H1R3             no   500   600     1   458    NaN