Python 如何使用参数在特定列上应用
我有一个Python 如何使用参数在特定列上应用,python,python-3.x,pandas,dataframe,apply,Python,Python 3.x,Pandas,Dataframe,Apply,我有一个pandas数据框,下面有val_min和val_max列: df val_min val_max 0 1001.0 1500.0 3 401.0 500.0 4 401.0 500.0 5 401.0 500.0 6 501.0 600.0 现在,我正尝试使用这两个列和apply函数创建一个新列,并基于我的函数中定义的某些函数创建一个新列,请参见下面的尝试: def get_range(df, val_min, val_max, new
pandas数据框
,下面有val_min
和val_max
列:
df
val_min val_max
0 1001.0 1500.0
3 401.0 500.0
4 401.0 500.0
5 401.0 500.0
6 501.0 600.0
现在,我正尝试使用这两个列和apply
函数创建一个新列,并基于我的函数中定义的某些函数创建一个新列,请参见下面的尝试:
def get_range(df, val_min, val_max, new_col):
if df[val_min] <500 & df[val_max]<500:
df[new_col] = "<500"
elif df[val_min] >500 & df[val_max]<=1000:
df[new_col] = "500 - 1000"
elif df[val_min] >1000 & df[val_max]<=2000:
df[new_col] = "1000 - 2000"
elif df[val_min] >2000 & df[val_max]<=5000:
df[new_col] = "2000 - 5000"
elif df[val_min] >5000 & df[val_max]<=7500:
df[new_col] = "5000 - 7500"
elif df[val_min] >7500 & df[val_max]<=10000:
df[new_col] = "7500 - 10000"
elif df[val_min] >10000 & df[val_max]<=12000:
df[new_col] = "10000 - 12000"
elif df[val_min] >12000 & df[val_max]<=15000:
df[new_col] = "12000 - 15000"
elif df[val_min] >15000 & df[val_max]>15000:
df[new_col] = ">15000"
df["new_col"] = df[["val_min", "val_max"]].apply(get_range, axis=1)
def get_范围(df、val_最小值、val_最大值、新列):
如果df[val_min]15000:
df[新颜色]=“>15000”
df[“新列”]=df[“最小值”、“最大值”]]。应用(获取范围,轴=1)
您应该将函数的结构更改为:
def get_range(x):
val_min=x.val_min
val_max=x.val_max
if (val_min <500)&(val_max<500):
return "<500"
elif (val_min >500)&(val_max<=1000):
return "500 - 1000"
...
例如:
import pandas as pd
def get_range(x):
val_min=x.val_min
val_max=x.val_max
if (val_min <500 )&(val_max<500):
return "<500"
elif (val_min>500)&(val_max<=1000):
return "500 - 1000"
df = pd.DataFrame({'val_min':[600, 34], 'val_max':[800, 340]})
df["new_col"] = df.apply(get_range, axis=1)
将熊猫作为pd导入
def get_范围(x):
val_min=x.val_min
val_max=x.val_max
如果(val_min你能试试这个吗?可能有用
def get_range(df, val_min, val_max, new_col):
if val_min <500 & val_max <500:
return "<500"
elif val_min >500 & val_max <=1000:
return "500 - 1000"
[...]
df["new_col"] = df[["val_min", "val_max"]].apply(get_range, axis=1)
def get_范围(df、val_最小值、val_最大值、新列):
如果val_min您可以将应用
与lambda一起使用
df = pd.DataFrame({"val_min":list(range(10,1000,100)),"val_max":list(range(20,2000,200))})
def get_range(val_min, val_max):
if val_min <500 & val_max<500:
new_col = "<500"
elif val_min >500 & val_max<=1000:
new_col = "500 - 1000"
elif val_min >1000 & val_max<=2000:
new_col = "1000 - 2000"
elif val_min >2000 & val_max<=5000:
new_col = "2000 - 5000"
elif val_min >5000 & val_max<=7500:
new_col = "5000 - 7500"
elif val_min >7500 & val_max<=10000:
new_col = "7500 - 10000"
elif val_min >10000 & val_max<=12000:
new_col = "10000 - 12000"
elif val_min >12000 & val_max<=15000:
new_col = "12000 - 15000"
elif val_min >15000 & val_max>15000:
new_col = ">15000"
return new_col
df["new_col"] = df[["val_min", "val_max"]].apply(lambda row :get_range(*row), axis=1)
df=pd.DataFrame({“val_min”:list(范围(101000100)),“val_max”:list(范围(202000200)))
def get_范围(最小值、最大值):
如果最小值为15000:
new_col=“>15000”
返回新的\u col
df[“新列”]=df[“最小值”、“最大值”]]。应用(lambda行:获取范围(*行),轴=1)
打印(df)
val\u min val\u max new\u col
0 10 20考虑使用np。选择
将numpy导入为np
病例=[(df.val_最小值<500)和(df.val_最大值<500),
(df.val_最小值>500)和(df.val_最大值1000)和(df.val_最大值2000)和(df.val_最大值5000)和(df.val_最大值7500)和(df.val_最大值10000)和(df.val_最大值12000)和(df.val_最大值15000)和(df.val_最大值>15000)]
值=['15000']
df['new_col']=np.select(案例、值、默认值=“”)
打印(df)
输出
val_min val_max new_col
0 1001.0 1500.0 1000 - 2000
1 401.0 500.0
2 401.0 500.0
3 401.0 500.0
4 501.0 600.0 500 - 1000
你能发布示例数据帧和预期输出吗?我已经更新了问题供你审阅。我认为可能会有所帮助。不,不是。它们是两件不同的事情。我这里没有使用剪切函数。pandas apply应该解决这个问题。我正在处理两个列。很遗憾,我得到以下错误:TypeError:ufunc输入类型不支持“bitwise_and”,并且根据强制转换规则“safe”无法将输入安全强制为任何支持的类型。
您应该更改val_min@Pythonista,您还可以通过定义要返回的变量来分解代码,并在代码末尾返回它,而不是返回在每一个if语句中都有它。只是一个建议:)哦,这是一个很棒的主意!我喜欢!比你强!:真有见地!谢谢。顺便问一下,为什么是空的?val_max是500。因此,根据您的问题描述,没有一个范围是满意的。默认值是一个空字符串。如果df[val_min]太棒了,这个问题应该改成if!我觉得它很有见地。@Pythonista很高兴知道。你还没有回答我之前的评论。
df = pd.DataFrame({"val_min":list(range(10,1000,100)),"val_max":list(range(20,2000,200))})
def get_range(val_min, val_max):
if val_min <500 & val_max<500:
new_col = "<500"
elif val_min >500 & val_max<=1000:
new_col = "500 - 1000"
elif val_min >1000 & val_max<=2000:
new_col = "1000 - 2000"
elif val_min >2000 & val_max<=5000:
new_col = "2000 - 5000"
elif val_min >5000 & val_max<=7500:
new_col = "5000 - 7500"
elif val_min >7500 & val_max<=10000:
new_col = "7500 - 10000"
elif val_min >10000 & val_max<=12000:
new_col = "10000 - 12000"
elif val_min >12000 & val_max<=15000:
new_col = "12000 - 15000"
elif val_min >15000 & val_max>15000:
new_col = ">15000"
return new_col
df["new_col"] = df[["val_min", "val_max"]].apply(lambda row :get_range(*row), axis=1)
val_min val_max new_col
0 10 20 <500
1 110 220 <500
2 210 420 <500
3 310 620 500 - 1000
4 410 820 500 - 1000
5 510 1020 500 - 1000
6 610 1220 500 - 1000
7 710 1420 500 - 1000
8 810 1620 500 - 1000
9 910 1820 500 - 1000
[Finished in 1.8s]
val_min val_max new_col
0 1001.0 1500.0 1000 - 2000
1 401.0 500.0
2 401.0 500.0
3 401.0 500.0
4 501.0 600.0 500 - 1000