【问题标题】:Filling previous value by field - Pandas apply function filling None按字段填充先前的值 - Pandas 应用函数填充无
【发布时间】:2020-09-02 05:56:37
【问题描述】:

我正在尝试使用特定子集的前一行中的值(满足条件时)填充新列(上一时间)中的每一行。问题是,如果我中断内核并检查值,就可以了。但如果它运行到最后,则新列中的所有行都将填充为 None。如果上一行不存在,那么我将用第一个值填充它。

Name       First round  Previous time
Runner 1   2            2
Runner 2   5            5
Runner 3   5            5
Runner 1   6            2
Runner 2   8            5
Runner 3   4            5
Runner 1   2            6
Runner 2   5            8
Runner 3   5            4

我尝试了什么:

df.insert(column = "Previous time", value = 999)

def fce(arg):
    runner= arg[0]
    stat = arg[1]

    if stat == 999:
        # I used this to avoid filling all rows in a new column again for the same runner
        first = df.loc[df['Name'] == runner,"First round"].iloc[0]
        df.loc[df['Name'] == runner,"Previous time"] = df.loc[df['Name'] == runner]["First round"].shift(1, fill_value = first)

df["Previous time"] = df[['Name', "Previous time"]].apply(fce, axis=1)

【问题讨论】:

    标签: pandas dataframe apply nonetype


    【解决方案1】:

    对每个名称进行分组移位,并用原始系列填充缺失的值。

    df['Previous time'] = (df.groupby('Name')['First round']
                             .shift()
                             .fillna(df['First round'], downcast='infer'))
    

    【讨论】:

      【解决方案2】:

      非常感谢。请问你能再回答我一个问题吗?如果我想根据特定跑步者在比赛前的睡眠时间返回所有回合的平均值,它如何与多列上的 group by 一起使用。

      Expected output:
          Name       First round  Sleep before race Mean
          Runner 1   2            8                 4 
          Runner 2   5            7                 6 
          Runner 3   5            8                 5
          Runner 1   6            8                 4
          Runner 2   8            7                 6
          Runner 3   4            9                 4,5
          Runner 1   2            9                 2
          Runner 2   5            7                 6
          Runner 3   5            9                 4,5
      

      这对我不起作用。

      def last_season(g):
          aa = g["First round"].mean()
      
      
      df["Mean"] = df.groupby(["Name", "Sleep before race"]).apply(g).reset_index(["Name", "Sleep before race"], drop=True)
      

      【讨论】:

        【解决方案3】:

        问题是您的函数fce 为每一行返回None,因此术语df[['Name', "Previous time"]].apply(fce, axis=1) 产生的系列是None 的系列。

        也就是说,您需要返回要填充此位置的值,而不是用df.loc inside 覆盖 Dataframe。不幸的是,这是不可能的,因为您需要知道您已经计算了哪些指数。

        更好的方法是使用groupby。这是一种更自然的方式,因为您想对每个组执行操作。如果您在groupby 之后使用apply 并返回一个系列,实际上您为每一行定义了一个值。请记住删除groupby 添加的额外索引"Name"。

        def fce(g): 
            first = g["First round"].iloc[0] 
            return g["First round"].shift(1, fill_value=first) 
        
        df["Previous time"] == df.groupby("Name").apply(fce).reset_index("Name", drop=True)
        

        【讨论】:

          猜你喜欢
          • 2013-02-10
          • 1970-01-01
          • 1970-01-01
          • 2012-01-22
          • 2018-05-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-06
          相关资源
          最近更新 更多