我有两个文件,第一个包含数据框,没有列名:
2008-03-13 15 56 0 25
2008-03-14 10 32 27 45
2008-03-16 40 8 54 35
2008-03-18 40 8 63 30
2008-03-19 45 32 81 25
和另一个文件,它包含以下格式的列名称列表(datetime列除外):
输出file.read()
列表(组,年龄,收入,位置)
在我的真实数据中,有更多的列和列名称。数据帧的列按列表的元素排序,即第一列对应于Group,第三列对应于Income,最后一列对应Location。 所以我的目标是使用包含在此文件中的元素命名我的数据框的列。 此操作由于显而易见的原因不起作用(日期时间列未包含在列表中,并且列表未以python格式格式化):
with open(file2) as f:
list_of_columns=f.read()
df=pd.read_csv(file1, sep='/t', names=list_of_columns)
我已经想象了从file2的输出中删除单词List和()以及在列表的头部添加列datetime的预处理工作,但如果你有更优雅和快速的解决方案,那么让我知道!
答案 0 :(得分:1)
如果列名列表以完全相同的格式显示为字符串,则可以执行以下操作:
with open(file2) as f:
list_of_columns=f.read()
list_of_columns = ['date'] + list_of_columns[5:-1].split(',')
list_of_columns = [l.strip() for l in list_of_columns] # remove leading/trailing whitespace
df=pd.read_csv(file1, sep='/t', names=list_of_columns)
答案 1 :(得分:1)
你可以这样做:
import re
fn = r'D:\temp\.data\36972593_header.csv'
with open(fn) as f:
data = f.read()
# it will also tolerate if `List(...) is not in the first line`
cols = ['Date'] + re.sub(r'.*List\((.*)\).*', r'\1', data, flags=re.S|re.I|re.M).replace(' ', '').split(',')
fn = r'D:\temp\.data\36972593_data.csv'
# this will also parse `Date` column as `datetime`
df=pd.read_csv(fn, sep=r'\s+', names=cols, parse_dates=[0])
结果:
In [82]: df
Out[82]:
Date Group Age Income Location
0 2008-03-13 15 56 0 25
1 2008-03-14 10 32 27 45
2 2008-03-16 40 8 54 35
3 2008-03-18 40 8 63 30
4 2008-03-19 45 32 81 25
In [83]: df.dtypes
Out[83]:
Date datetime64[ns]
Group int64
Age int64
Income int64
Location int64
dtype: object