【问题标题】:Is there a better way to keep few columns by dropping several columns from a DataFrame than to use .drop()?有没有比使用 .drop() 更好的方法通过从 DataFrame 中删除几列来保留几列?
【发布时间】:2020-06-10 16:03:57
【问题描述】:

很想知道是否有更好的方法来将所需的列保留在数据框中,如果我需要保留的列是一小部分而要删除的列是其中的几个

import numpy as np
df1 = pd.DataFrame(np.random.randint(10,99, size=(13, 26)), columns =list('abcdefghijklmnopqrstuvwxyz'))
df1

输出:


a   b   c   d   e   f   g   h   i   j   ... q   r   s   t   u   v   w   x   y   z
0   78  60  27  38  21  93  74  47  16  53  ... 79  56  40  41  87  80  14  82  12  50
1   84  73  59  46  91  43  22  28  57  52  ... 27  65  81  72  68  90  68  61  22  44
2   56  37  29  52  57  14  87  82  46  90  ... 67  57  29  14  55  30  46  72  56  91
3   86  44  46  79  41  74  32  49  42  32  ... 33  34  40  17  30  78  29  75  80  52
4   14  89  90  79  67  17  34  39  57  37  ... 93  49  78  91  26  73  40  48  91  36
5   16  62  32  87  56  81  82  17  59  57  ... 84  24  97  39  46  40  68  53  73  40
6   69  72  16  47  37  20  27  56  13  37  ... 10  28  17  35  39  14  51  85  69  53
7   81  34  35  20  66  44  86  23  94  57  ... 38  45  76  53  82  72  64  34  81  43
8   95  90  97  31  18  85  74  18  43  22  ... 20  20  96  25  53  76  55  96  58  98
9   73  53  72  94  55  33  22  40  11  64  ... 84  66  85  34  94  32  78  72  10  62
10  73  24  57  17  63  24  94  25  59  84  ... 34  45  27  28  47  23  38  80  45  41
11  69  18  22  42  95  38  16  47  68  36  ... 59  69  35  39  78  75  85  86  53  55
12  46  27  53  77  48  15  57  90  32  57  ... 32  79  18  67  71  86  54  11  36  51
13 rows × 26 columns

说,我只需要保留一些随机列,例如e,u,r,q,j;有没有更好的方法让他们必须运行 df1.drop() 并传入 21 个列名?我在任何问题中都找不到更好的方法。

编辑: 与解决方案不同 Selecting multiple columns in a pandas dataframe 因为要选择删除的列是随机的而不是连续的

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

您可以将要保留的所有行复制到一个新的数据框中,然后像这样覆盖您的第一个数据框:

    import numpy as np
    import pandas as pd        
    df1 = pd.DataFrame(np.random.randint(10,99, size=(13, 26)), columns =list('abcdefghijklmnopqrstuvwxyz'))
    df2 = pd.DataFrame()
    columns_to_keep = ["e", "r", "u"]
    for column in columns_to_keep:
        df2[column] = df1[column]
    df1 = df2
    df1

或者使用 for 语句删除不在列表中的任何项目:

    columns_to_keep = ["e", "r", "u"]
    for column_name, column_data in df1.iteritems():
      if column_name not in columns_to_keep:
        df1 = df1.drop(column_name, axis=1)
    df1

【讨论】:

  • 谢谢@Ben。这是一个很好的解决方案。我很想知道是否有就地解决方案,因为我们必须在这个解决方案中创建一个新的数据框。 .drop() 似乎可以选择就地完成此操作。不过,很好的解决方案!
  • 编辑后的解决方案(第二个)看起来更好,并解决了我的上述评论。谢谢!
【解决方案2】:

让我们使用列过滤并重新分配回 df1:

df1 = pd.DataFrame(np.random.randint(10,99, size=(13, 26)), columns =list('abcdefghijklmnopqrstuvwxyz'))    
columns_to_keep = ["e", "r", "u"]
df1 = df1[columns_to_keep]
df1.head()

输出:

    e   r   u
0  65  95  13
1  58  42  75
2  95  34  12
3  43  20  79
4  83  27  47

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 2017-04-07
    • 2021-10-11
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多