吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2972|回复: 27
收起左侧

[求助] pandas apply 中f需要两个参数,(已解决)

[复制链接]
ymhld 发表于 2020-4-18 15:28
本帖最后由 ymhld 于 2020-4-18 18:08 编辑

[Python] 纯文本查看 复制代码
import pandas as pd



chengji=[[100,95,100,98],[90,98,99,94],[88,95,98,95],[99,98,97,92],[95,90,96,88],[94,94,93,77]]

data=pd.DataFrame(chengji,columns=['语文','类别','数学','政治'])

print(data.index,data.columns)

print(data,data.dtype())



data4=data.copy(deep=True)

data4=data4[['语文','数'+'学']]

#data4['数学评级']=0

data4['数学'+'评级']=data4['数'+'学'].apply(lambda x,y:x+y if x >=95  else x-y,y='语文')

print("*"*50,"筛选数学大于95相加")

print(data4)




想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到

这只是个例子,真实的用途是判断某个值为0,则不做为除数

        data2[calname+'完成比例本月']=data2['任务指标'+calname].apply(lambda x:0 if x==0
            else data2[calname+'本月数']/x*100)

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| ymhld 发表于 2020-4-18 16:00

有啥好办法解决?
 楼主| ymhld 发表于 2020-4-18 16:21
本帖最后由 ymhld 于 2020-4-18 16:30 编辑

def sum_test(a,b):
    return a+b
data4['数学'+'评级']=data4.apply(lambda x: sum_test(x['语文'],x['数学']),axis=1)

网上找个例子,只能相加,这个没啥用,直接加也能出来数,不用这麻烦,不过这个倒是可以传递两列参数了


https://blog.csdn.net/maotianyi941005/article/details/84337586
Jack-lee 发表于 2020-4-18 16:48
# 想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到
def function(x):
    if x['数学']>=95:
        s=x['数学']+x['语文']
    else:
        s=x['数学']-x['语文']
   
    return s

data['result']=data.apply(function,axis=1)
data

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ymhld + 1 + 1 热心回复!

查看全部评分

 楼主| ymhld 发表于 2020-4-18 16:56
Jack-lee 发表于 2020-4-18 16:48
# 想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到
def function(x): ...

chengji=[[100,95,100,98],[90,98,0,94],[88,95,98,95],[99,98,97,92],[95,90,96,88],[94,94,93,77]]

如果是这个数据,想数学当成分母,语文当分子,如果判断数学不为零时再计算?
 楼主| ymhld 发表于 2020-4-18 16:59
Jack-lee 发表于 2020-4-18 16:48
# 想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到
def function(x): ...

chengji=[[100,95,100,98],[90,98,0,94],[88,95,98,95],[99,98,97,92],[95,90,96,88],[94,94,93,77]]
data=pd.DataFrame(chengji,columns=['语文','类别','数学','政治'])
print(data.index,data.columns)
print(data,data.dtypes)

data4=data.copy(deep=True)
data4=data4[['语文','数'+'学']]
#data4['数学评级']=0
def sum_test(a,b):
    return a+b
data4['数学'+'评级']=data4.apply(lambda x: sum_test(x['语文'],x['数学']),axis=1)
#df ['sum_value'] = df.apply(lambda x: sum_test(x['列名1'],x['列名2']), axis=1)
print("*"*50,"筛选数学大于95相加")
print(data4)

data4=data.copy(deep=True)
def function(x):
    if x['数学']!=0:
        s=x['语文']/x['数学']
    else:
        s=0   
    return s

data4['result']=data4.apply(function,axis=1)
print(data4)
 楼主| ymhld 发表于 2020-4-18 17:03
Jack-lee 发表于 2020-4-18 16:48
# 想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到
def function(x): ...

def div_test(x):
    if x['任务指标'+calname]!=0:
        s=x[calname+'本月数']/x['任务指标'+calname]*100
    else:
        s=0   
    return s



for namelist in namelists:
    print ('生成下属企业 %s 表'%namelist)
    data2=totaldata1[totaldata1['企业']==namelist].copy() #不加。copy,会提示SettingWithCopyWarning:
   
    calnames=['营业收入','营业成本','利润总额','三项费用']
    for calname in calnames:
        data2[calname+'完成比例本月']=0
        #print('任务指标'+calname)
        #data2[data2['任务指标'+calname]==0,calname+'完成比例本月']=0
        data2[calname+'完成比例本月']=data2.apply(div_test,axis=1)


因为列名中还有需要带的字符串参数,应该怎么处理呢?
 楼主| ymhld 发表于 2020-4-18 17:07
Jack-lee 发表于 2020-4-18 16:48
# 想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到
def function(x): ...

因为列名中还有需要带的字符串参数,应该怎么处理呢?
 楼主| ymhld 发表于 2020-4-18 17:25
Jack-lee 发表于 2020-4-18 16:48
# 想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到
def function(x): ...


data4=data.copy(deep=True)
data4['result']=0
data4.loc[data4['数学']!=0,'result']=data4['语文']/data4['数学']
print(data4)

头大了,这样例子是可以用的,但引入字符串又出现错误了
 楼主| ymhld 发表于 2020-4-18 17:51
Jack-lee 发表于 2020-4-18 16:48
# 想让数学评级中 如果数学成绩大于95 与语文相加,如果小于95,减语文成绩,如何能做到
def function(x): ...

感谢,我知道哪里出错了,是有个字符串定义没有弄好

您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 17:29

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表