【问题标题】:Drop pandas columns based on lambda during method chaining在方法链接期间基于 lambda 删除 pandas 列
【发布时间】:2022-07-02 04:49:30
【问题描述】:

我想使用 lambda 删除 pandas DataFrame 的列。像How can I use lambda to drop column of pandas dataframe? 这样的问题讨论了这个问题,但我希望能够在方法链接构造中做到这一点(这不是另一个问题中的条件)。我该怎么做?

其他问题,例如Method chaining solution to drop column level in pandas DataFrame,讨论列级别,但这也不同。

【问题讨论】:

    标签: python pandas lambda method-chaining


    【解决方案1】:

    假设您想使用列名作为删除每一列的指示符。在这里,我提供选项:

    from time import time
    import numpy as np
    import pandas as pd
    
    d = pd.DataFrame(np.random.randint(0, 10, (10000, 7)), columns=['a', 'b', 'c', 'd', 'e', 'f', 'g'])
    print(d.shape)
    
    t0 = time()
    d.apply(lambda row: pd.Series([row[col_name] for col_name in row.index if col_name == 'a'],
                                  index=[col_name for col_name in row.index if col_name == 'a']), axis=1, result_type="expand")
    print(time() - t0)
    
    t0 = time()
    d.apply(lambda column: len(column)*[np.nan] if column.name == 'a' else column, axis=0).dropna(how='all', axis=1)
    print(time() - t0)
    

    (10000, 7)

    5.570859670639038

    0.005705833435058594

    由于该列可用于提取您喜欢的任何条件,您可以相应地调整条件。

    虽然第一个解决方案不那么老套,但它会遍历每一行,因此速度非常慢。第二个版本非常快,虽然有点 hacky:您需要确定,没有其他列只有 np.nan 值。

    也许其他人有一个快速但仍然不是黑客的解决方案。

    【讨论】:

    • 你能用一个具体的例子来说明你的解决方案吗?
    【解决方案2】:

    您可以使用pipe 在方法链中进行过滤:

    import pandas as pd
    
    df = pd.DataFrame({'a': range(10), 'b': ["A"]*5 + ["B"]*5})
    df.some_chain_of_methods.pipe(lambda x: x.loc[x.b == "A"])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-19
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-13
      相关资源
      最近更新 更多