如何使用Python从数据帧中删除列?

如何使用Python从数据帧中删除列?,python,pandas,Python,Pandas,我有以下代码(Python 2.7): 这将从数据流创建压缩的csv文件。 现在,我想确保文件中的列是我期望的(顺序不重要)。这意味着,如果出于任何原因,数据流包含的列数超过此列数,则将被删除。请注意,我在数据流中添加了自己的一列,名为timestamp 允许的列包括: cols_list = ['order_id', 'customer_id', 'date', 'price'] 我知道有deldf['column_name']选项,但这对我不起作用,因为我不知道什么是多余的列名 我要找的东

我有以下代码(Python 2.7):

这将从数据流创建压缩的csv文件。 现在,我想确保文件中的列是我期望的(顺序不重要)。这意味着,如果出于任何原因,数据流包含的列数超过此列数,则将被删除。请注意,我在数据流中添加了自己的一列,名为
timestamp

允许的列包括:

cols_list = ['order_id', 'customer_id', 'date', 'price']
我知道有
deldf['column_name']
选项,但这对我不起作用,因为我不知道什么是多余的列名

我要找的东西是:

if col_name not it cols_list:
   del df[???]  #delete column and it's data.
   print [???]  #print the name of the redundant column for log
我认为这里有两种方法:

  • 首先不要将冗余列添加到
    df
  • 完成
    df.append
    后,删除冗余列
  • 我更喜欢第一个选项,因为它应该具有更好的性能(?)

    我的一次尝试是:

    for i, data in enumerate(df):
            for col_name in cols_list:
                if col_name not in data.keys():
                   del df[col_name ]
    
    但是它不起作用

    如果col_name不在data.keys()中:AttributeError:'str'对象没有属性'keys'


    我不确定我是否枚举了
    df
    本身

    df.append
    完成后删除冗余列非常简单:

    df = df[cols_list]
    

    对于第一个建议,您可以在将其附加到
    df
    之前应用上述语句。但是,您应该注意,这需要一个
    pandas数据帧
    对象,因此您可能需要首先将
    data.result()
    转换为pandas数据帧。

    根据函数read\u csv at的pandas文档,有一个参数“usecols”,描述如下:

    usecols:类似列表或可调用,默认为无

    返回列的子集。如果类似于列表,则所有元素都必须 位置性(即文档列中的整数索引)或 与中的用户提供的列名相对应的字符串 名称或从文档标题行推断的名称。例如,一个 像usecols参数这样的有效列表应该是[0,1,2]或['foo','bar', “baz”]。元素顺序被忽略,因此usecols=[0,1]与[1]相同, 0]. 从保留元素顺序的数据实例化数据帧 使用pd.read_csv(数据,usecols=['foo','bar'])[['foo','bar']]来 按['foo'、'bar']顺序或pd.read\u csv(数据,usecols=['foo', 对于['bar',foo']]订单,['bar',foo']]]

    如果可调用,将根据 列名,返回可调用函数计算结果的名称 对。一个有效的可调用参数示例是lambda x: x、 ['AAA','BBB','DDD']中的上限()。使用此参数会导致 更快的解析时间和更低的内存使用率


    这就是您问题的答案。

    如果您想尝试使用
    for loop
    工作,请尝试以下方法:

    for col_name in df.columns:
        if col_name not in cols_list:
           del df[col_name]
    
    我认为需要通过
    列名列表
    s,然后通过
    子集
    []
    进行过滤:

    cols_list = ['order_id', 'customer_id', 'date', 'price']
    cols = df.columns.intersection(cols_list)
    df = df[cols]
    

    cols_list是应该保留的列。我不知道需要删除的列的名称。所有不在cols_列表中的东西都应该删除是的,如果你使用我提供的函数,它只会将cols_列表中指定的列添加到新的
    df
    变量。这并不能回答我的问题:)为什么不直接获取一个新的数据帧,该数据帧将包含来自上一个数据帧的所需列以及您添加的新列。这样,如果前一个数据帧中有更多的列,那么这并不重要,因为您将只处理新数据帧中所需的列dataframe@Inder我不确定我在跟踪你。我无法将上一个CSV强制转换为当前CSV。我在代码完成后删除它们。csv是将数据上传到BigQuery的一个步骤。我想说的是,您只需要数据帧df(1)中的订单id、客户id、日期、价格,可以有10列。只需创建一个空的数据帧df(2),从df(1)中分配所需的列,例如df(2)[“customer id”]=df(1)[“customer id”]。此外,您还可以将自定义列添加到此新数据框,并根据需要使用它。您可以确保无论原始数据框是什么,它都只包含所需的列had@Inder这可能会消耗大量的内存和时间。。。难道没有别的办法吗?只对所需列执行df.append怎么样?如果列数不同,append将抛出错误。这不是解决方案。首先,你假设我读了错的。我将文件上传到Google存储并用它更新BigQuery。其次,可能有20多列我需要忽略。。假设每个文件有500K行,它会占用大量的空间,而这些空间没有任何用途,更不用说处理时间了。那么我建议至少标题需要更改,它特别提到了csv。但我还想指出,您必须有排除列的标准,并且假设这些列可以编码,因此您可能希望使用类似此参数的可调用版本,它可以是一个函数。
    cols_list = ['order_id', 'customer_id', 'date', 'price']
    cols = df.columns.intersection(cols_list)
    df = df[cols]