如何解决使用iloc,apply和带有df列的lambda作为条件的一部分
所以我有这种代码:
import pandas as pd
import numpy as np
myData = {'Price': [30000,199,30000,199],'Length': [7,7,6]
}
df = pd.DataFrame(myData,columns=['Price','Length'])
print(df)
df.iloc[:,np.r_[0]] = df.iloc[:,np.r_[0]].apply(lambda x: [y if y >= 30000 else round(y / 2,0) for y in x])
print(df)
它的作用是,从“价格”列中获取值,如果该值等于或大于30 000,则不更改该值,否则将其除以2并四舍五入为整数。 这样做效果很好,但我确实遇到的问题是如何更改此代码,以按“ Length”列中的值将其除以???
我需要使用iloc,因为我不知道列的名称(它们可能会更改,但它们的位置不会改变),并且我想使用apply和lambda解决它。
另一个问题是如何使用相同的东西,但是例如,我想将两列分开(让“价格”和“年龄”除以“长度”列中的值)。
感谢您对此问题的帮助。
编辑:
基于jezrael的以下回答,我设法使用循环解决了第二个问题:
import pandas as pd
import numpy as np
myData = {'Price': [30000,'Age': [7,14,21,28,30000],7]
}
df = pd.DataFrame(myData,'Age','Length'])
for column in df.columns[np.r_[0,1]]:
df[column] = np.where(df[column] >= 30000,df[column],(df[column] / df.iloc[:,2]).round())
print(df[column])
print(df)
我想知道如果不使用循环就可以做到吗?
解决方法
按条件使用numpy.where
,此处不推荐使用apply
,因为它很慢:
df.iloc[:,0] = np.where(df.iloc[:,0] >= 30000,df.iloc[:,0],(df.iloc[:,0] / df.iloc[:,1]).round())
print(df)
Price Length
0 30000.0 7
1 28.0 7
2 30000.0 7
3 28.0 7
4 33.0 6
编辑:
要使用多列,请使用DataFrame.iloc
并将值用axis=0
除以DataFrame.div
:
df.iloc[:,[0,1]] = np.where(df.iloc[:,1]] >= 30000,1]],1]].div(df.iloc[:,2],axis=0).round())
print (df)
Price Age Length
0 30000.0 1.0 7
1 28.0 2.0 7
2 30000.0 3.0 7
3 28.0 4.0 7
4 28.0 30000.0 7
,
一种方法是使用.loc
和.iloc
查找列小于30000的所有索引。使用此过滤器,将除法应用于所需数据
mask = df.loc[df.iloc[:,0] < 30000].index
df.iloc[mask,0] = (df.iloc[mask,0] / df.iloc[mask,1]).round()
#output
Price Length
0 30000.0 7
1 28.0 7
2 30000.0 7
3 28.0 7
4 33.0 6
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。