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