【问题标题】:Dataframe list comprehension "zip(...)": loop through chosen df columns efficiently with just a list of column name strings数据框列表理解“zip(...)”:仅使用列名字符串列表有效地循环选择的 df 列
【发布时间】:2019-03-07 13:15:14
【问题描述】:

这只是一个挑剔的句法问题......

我有一个数据框,我想使用列表推导来评估使用大量列的函数。

我知道我能做到

df['result_col'] = [some_func(*var) for var in zip(df['col_1'], df['col_2'],... ,df['col_n'])]

我想做这样的事情

df['result_col'] = [some_func(*var) for var in zip(df[['col_1', 'col_2',... ,'col_n']])]

即不必写dfn 次。我一辈子都搞不懂语法。

【问题讨论】:

  • 试试这个df['result_col'] = [some_func(*var) for var in zip(*df[col for col in ['col_1', 'col_2',... ,'col_n']])]?
  • 你为什么不直接使用 apply:df['reult_col'] = df.apply(lambda x: some_func(*tuple(x.values)), axis=1) ?
  • @cryptonome 似乎是某处的语法错误.. 缺少括号或括号?
  • @gyx-hh 我认为 apply 很慢。但老实说,我什至没有考虑过
  • @cryptonome df['result_col'] = [some_func(*var) for var in zip(*[df[col] for col in ['col_1', 'col_2',... ,'col_n']])] 工作。谢谢。如果您想为您的答案发表评论,请将其发布,我会将其标记为答案。

标签: python pandas zip list-comprehension columnname


【解决方案1】:

这应该可行,但老实说,OP 自己也想出来了,所以 +1 OP :)

df['result_col'] = [some_func(*var) for var in zip(*[df[col] for col in ['col_1', 'col_2',... ,'col_n']])]

【讨论】:

    【解决方案2】:

    如上面的 cmets 所述,您应该改用 apply

    df['reult_col'] = df.apply(lambda x: some_func(*tuple(x.values)), axis=1)
    

    【讨论】:

    • 谢谢。我不会遍历数据框中的所有列。否则毫无疑问,这会更干净。
    • 你可以做df[['col1', 'col2', 'col3']].apply(...)
    • df.apply(), df.itertuples(), df.iteritems(), df.iterrows() 比列表理解慢很多,不推荐
    【解决方案3】:

    df.apply() 几乎和 df.iterrows() 一样慢,两者都不推荐,见How to iterate over rows in a DataFrame in Pandas --> 搜索@cs95a 的“An Obvious Example”并查看对比图。由于最快的方法(向量化、Cython 例程)不容易实现,因此排名第三且通常最好的解决方案是列表理解:

    # print 3rd col
    def some_func(row):
        print(row[2])
    
    
    df['result_col'] = [some_func(*row) for row in zip(df[['col_1', 'col_2',... ,'col_n']].to_numpy())]
    

    # print 3rd col
    def some_func(row):
        print(row[2])
    
    df['result_col'] = [some_func(row[0]) for row in zip(df[['col_1', 'col_2',... ,'col_n']].to_numpy())]
    

    # print 3rd col
    def some_func(x):
        print(x)
    
    df['result_col'] = [some_func(row[0][2]) for row in zip(df[['col_1', 'col_2',... ,'col_n']].to_numpy())]
    

    另见:

    编辑:

    请使用 df.iloc 和 df.loc 代替 df[[...]],参见Selecting multiple columns in a pandas dataframe

    【讨论】:

      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      • 1970-01-01
      • 2022-09-26
      相关资源
      最近更新 更多