代码之家  ›  专栏  ›  技术社区  ›  user1403546

函数式编程和python在管道中创建数据帧

  •  0
  • user1403546  · 技术社区  · 6 年前

    这里有两个想法,但希望有更好的存在:)

    想法#1-没有函数编程,但节省内存

    def foo(df, param):
        df['col'] = df['col'] + param
    
    def pipeline(df):
        foo(df, 1)
        foo(df, 2)
        foo(df, 3)
    

    想法#2-更多的函数式编程,但通过执行.copy()来浪费内存

    def foo(df, param):
        df = df.copy()
        df['col'] = df['col'] + param
        return df
    
    def pipeline(df):
        df1 = foo(df, 1)
        df2 = foo(df1, 2)
        df3 = foo(df2, 3)
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Elmex80s    6 年前

    如果您的数据帧是一维的(也就是说它是一个项目列表),那么您可以不用应用多个“管道”,而是一次完成所有事情。例如,我们得到一个数据帧

    >>> table
         Name  Year of Birth      City
    0    Mike           1970  New York
    1   Chris           1981     Miami
    2  Janine           1975   Seattle
    

    我们想计算一下年龄,看看有没有人住在迈阿密。可以应用两个管道,但可以使用单个lambda进行:

    >>> f = lambda s: pd.Series([2019 - s['Year of Birth'], s['City'] == 'Miami'])
    

    >>> table[['Age', 'Lives in Miami']] = table.apply(f, axis=1)
    >>> table
         Name  Year of Birth      City  Age  Lives in Miami
    0    Mike           1970  New York   49           False
    1   Chris           1981     Miami   38            True
    2  Janine           1975   Seattle   44           False
    

    所有的工作都在办公室里完成 f .

    操作(上一个示例是2 平行

    1. 计算年龄

    您可以使用两个管道,但也可以通过应用一个lambda来完成这一切:

    >>> table
         Name  Year of Birth      City   
    0    Mike           1970  New York            
    1   Chris           1981     Miami           
    2  Janine           1975   Seattle      
    >>> g = lambda s: pd.Series([2019 - s['Year of Birth'] > 45])              
    >>> table['Older than 45'] = table.apply(g, axis=1)
    >>> table
         Name  Year of Birth      City  Older than 45
    0    Mike           1970  New York           True
    1   Chris           1981     Miami          False
    2  Janine           1975   Seattle          False
    

    如果你喜欢不变性,那就做吧

    >>> table
         Name  Year of Birth      City
    0    Mike           1970  New York
    1   Chris           1981     Miami
    2  Janine           1975   Seattle 
    >>> pd.concat([table, table.apply(f, axis=1)], axis=1)
         Name  Year of Birth      City   0      1
    0    Mike           1970  New York  49  False
    1   Chris           1981     Miami  38   True
    2  Janine           1975   Seattle  44  False
    

    如果你不喜欢lambdas,那么定义

    def f(s):
        return pd.Series([2019 - s['Year of Birth'], 
                          s['City'] == 'Miami'])
    

    (最后你意识到你最好使用Haskell。)

        2
  •  5
  •   T Burgis    6 年前

    您可以链接在数据帧上操作的函数调用。还可以看看 DataFrame.pipe

    df = (df.pipe(foo,1)
          .pipe(foo,2)
          .pipe(foo,3)
          .drop(columns=['drop','these'])
          .assign(NEW_COL=lambda x: x['OLD_COL'] / 10))
    

    df 将是传递给 foo 当你使用 pipe