【问题标题】:Delete a column in a pandas' DataFrame if its sum is less than x如果其总和小于 x,则删除 pandas 的 DataFrame 中的一列
【发布时间】:2016-03-03 14:38:52
【问题描述】:

我正在尝试创建一个程序,如果该列的总和小于 10,它将删除 Panda 数据框中的一列。

我目前有以下解决方案,但我很好奇是否有更 Python 的方式来做到这一点。

df = pandas.DataFrame(AllData)
sum = df.sum(axis=1)
badCols = list()
for index in range(len(sum)):
    if sum[index]  < 10:
        badCols.append(index)
df = df.drop(df.columns[badCols], axis=1)

在我的方法中,我创建了一个总和小于 10 的列索引列表,然后我删除了这个列表。有没有更好的方法来做到这一点?

【问题讨论】:

    标签: python python-2.7 pandas


    【解决方案1】:

    您可以调用sum 来生成一个Series,它给出了每列的总和,然后使用它来针对您的列数组生成一个布尔掩码,并使用它来过滤df。 DF 生成代码借用来自@Alexander:

    In [2]:
    df = pd.DataFrame({'a': [1, 10], 'b': [1, 1], 'c': [20, 30]})
    df
    
    Out[2]:
        a  b   c
    0   1  1  20
    1  10  1  30
    
    In [3]:    
    df.sum()
    
    Out[3]:
    a    11
    b     2
    c    50
    dtype: int64
    
    In [6]:
    df[df.columns[df.sum()>10]]
    
    Out[6]:
        a   c
    0   1  20
    1  10  30
    

    【讨论】:

      【解决方案2】:

      您可以通过使用列表理解和iteritems 来识别所有符合您的标准的列,从而使用单行来实现您的目标。

      df = pd.DataFrame({'a': [1, 10], 'b': [1, 1], 'c': [20, 30]})
      >>> df
          a  b   c
      0   1  1  20
      1  10  1  30
      
      df.drop([col for col, val in df.sum().iteritems() if val < 10], axis=1, inplace=True)
      
      >>> df
          a   c
      0   1  20
      1  10  30
      

      【讨论】:

        猜你喜欢
        • 2019-10-15
        • 1970-01-01
        • 2020-09-30
        • 2019-10-21
        • 2020-10-04
        • 1970-01-01
        • 2021-02-20
        • 2018-05-01
        相关资源
        最近更新 更多