目前,我必须提前阅读CSV文件并设置标题。然后放下我不想要的列。有没有办法直接这样做?
# Current Code
columns_name = ['station', 'date', 'observation', 'value', 'other_1',
'other_2', 'other_3', 'other_4']
del_columns_name = ['other_1', 'other_2', 'other_3', 'other_4']
df =pd.read_csv('filename', names = columns_name)
df.drop(del_columns_name, axis=1)
答案 0 :(得分:2)
一种方法是使用两个列表来解析所需的索引和列名。
然后使用pd.read_csv
的usecols
和names
参数分别指定列索引和名称。
idx, cols = list(zip(*((i, x) for i, x in enumerate(columns_name) \
if x not in del_columns_name)))
df = pd.read_csv('filename', usecols=idx, names=cols, header=None)
正如文档中所述,当没有标题时,您还应明确指定header=None
。
<强>解释强>
columns_name
并删除del_columns_name
以外的项目。enumerate
提取索引。zip
为索引和列名创建单独的元组。答案 1 :(得分:2)
我想你甚至可以马上指定索引。在这种情况下,您对以下内容感兴趣:[0,1,2,3]
。考虑这个也解析日期的例子。
import pandas as pd
cols = ['station', 'date', 'observation', 'value']
data = '''\
1, 2018-01-01, 1, 1, 1, 1, 1, 1
2, 2018-01-02, 2, 2, 2, 2, 2, 2'''
file = pd.compat.StringIO(data)
df = pd.read_csv(file, names=cols, usecols=[0,1,2,3], parse_dates=[1])
print(df)
返回:
station date observation value
0 1 2018-01-01 1 1
1 2 2018-01-02 2 2