Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用参数在特定列上应用_Python_Python 3.x_Pandas_Dataframe_Apply - Fatal编程技术网

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