【问题标题】:How to apply a function with multiple arguments to a specific column in Pandas?如何将具有多个参数的函数应用于 Pandas 中的特定列?
【发布时间】:2019-12-29 22:28:37
【问题描述】:

我正在尝试将函数应用于此数据框中的特定列

       datetime       PM2.5        PM10         SO2         NO2  
0    2013-03-01    7.125000   10.750000   11.708333   22.583333   
1    2013-03-02   30.750000   42.083333   36.625000   66.666667  
2    2013-03-03   76.916667  120.541667   61.291667   81.000000 
3    2013-03-04   22.708333   44.583333   22.854167   46.187500 
4    2013-03-06  223.250000  265.166667  116.236700  142.059383
5    2013-03-07  263.375000  316.083333   97.541667  147.750000
6    2013-03-08  221.458333  297.958333   69.060400  120.092788 

我正在尝试将此函数(如下)应用于上述数据帧的特定列(PM10):

range1 = [list(range(0,50)),list(range(51,100)),list(range(101,200)),list(range(201,300)),list(range(301,400)),list(range(401,2000))]

def c1_c2(x,y):
for a in y:
    if x in a:
        min_val = min(a)
        max_val = max(a)+1
        return max_val - min_val

其中“x”可以是任意列,“y”= Range1

可用选项

df.PM10.apply(c1_c2,args(df.PM10,range1),axis=1)
df.PM10.apply(c1_c2)

我已经尝试了这几个可用的选项,但它们似乎都不起作用。有什么建议吗?

【问题讨论】:

  • xy 相对于 PM10 列是什么?
  • x = PM10 或任何其他列,并且 y = range1。

标签: python-3.x pandas function apply


【解决方案1】:

不确定函数的预期输出是什么。但是要调用该函数,您可以尝试以下方法

from functools import partial

df.PM10.apply(partial(c1_c2, y=range1))

【讨论】:

    【解决方案2】:

    更新: 好吧,我想我明白了一点。这应该可行,但“range1”是整数列表的列表。您的数据没有整数,新列显示为空。我根据您有效的初始数据创建了另一个列表。见下文:

    df = pd.read_csv('pm_data.txt', header=0)
    
    range1= [[7.125000,10.750000,11.708333,22.583333],list(range(0,50)),list(range(51,100)),list(range(101,200)),
    list(range(201,300)),list(range(301,400)),list(range(401,2000))]
    
    def c1_c2(x,y):
      for a in y:
        if x in a:
            min_val = min(a)
            max_val = max(a)+1
            return max_val - min_val
    
    df['function']=df.PM10.apply(lambda x: c1_c2(x,range1))
    
    print(df.head(10))
    
    datetime       PM2.5        PM10         SO2         NO2  new_column   function
    0  2013-03-01    7.125000   10.750000   11.708333   22.583333   25.750000  16.458333
    1  2013-03-02   30.750000   42.083333   36.625000   66.666667    2.104167        NaN
    2  2013-03-03   76.916667  120.541667   61.291667   81.000000    6.027083        NaN
    3  2013-03-04   22.708333   44.583333   22.854167   46.187500    2.229167        NaN
    4  2013-03-06  223.250000  265.166667  116.236700  142.059383   13.258333        NaN
    5  2013-03-07  263.375000  316.083333   97.541667  147.750000   15.804167        NaN
    6  2013-03-08  221.458333  297.958333   69.060400  120.092788   14.897917        NaN
    

    只有“function”中的第一项匹配,因为它来自您的初始数据,因为“if x in a”。


    旧代码:

    我也不确定你在做什么。但是您可以使用 lambda 来修改列或创建新列。

    这样,

    import pandas as pd
    

    我创建了一个数据文件以从您在上面发布的数据中导入:

    datetime,PM2.5,PM10,SO2,NO2
    2013-03-01,7.125000,10.750000,11.708333,22.583333   
    2013-03-02,30.750000,42.083333,36.625000,66.666667  
    2013-03-03,76.916667,120.541667,61.291667,81.000000 
    2013-03-04,22.708333,44.583333,22.854167,46.187500 
    2013-03-06,223.250000,265.166667,116.236700,142.059383
    2013-03-07,263.375000,316.083333,97.541667,147.750000
    2013-03-08,221.458333,297.958333,69.060400,120.092788  
    

    我是这样导入的,

    df = pd.read_csv('pm_data.txt', header=0)
    

    并创建一个新列并将函数应用于“PM10”中的数据

    df['new_column'] = df['PM10'].apply(lambda x: x+15 if x < 30 else x/20)
    

    产生,

        datetime       PM2.5        PM10         SO2         NO2  new_column
    0  2013-03-01    7.125000   10.750000   11.708333   22.583333   25.750000
    1  2013-03-02   30.750000   42.083333   36.625000   66.666667    2.104167
    2  2013-03-03   76.916667  120.541667   61.291667   81.000000    6.027083
    3  2013-03-04   22.708333   44.583333   22.854167   46.187500    2.229167
    4  2013-03-06  223.250000  265.166667  116.236700  142.059383   13.258333
    5  2013-03-07  263.375000  316.083333   97.541667  147.750000   15.804167
    6  2013-03-08  221.458333  297.958333   69.060400  120.092788   14.897917
    

    如果这有帮助,请告诉我。

    【讨论】:

      【解决方案3】:

      “我已经尝试了这几个可用的选项,但似乎都没有工作......”


      你这是什么意思?你的输出是什么,你得到错误还是什么?

      我发现了几个问题:

      • range1 列表包含 int 而您的列值为 float,因此 c1_c2() 将返回 None
      • 如果range1columns 中的数据类型相同,当range1 中没有值时,c1_c2() 将返回None

      假设数据类型匹配,我会这样做:

      def c1_c2(x):
          range1 = [list of lists]
          for a in range1:
              if x in a:
                  min_val = min(a)
                  max_val = max(a)+1
                  return max_val - min_val
              return x # returns the original value if not in range1
      
      df.PM10.apply(c1_c2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-07
        • 2016-03-20
        • 2021-10-02
        • 1970-01-01
        相关资源
        最近更新 更多