将数据框与列名列表进行匹配

时间:2016-05-01 22:15:15

标签: python list pandas dataframe match

我有两个文件,第一个包含数据框,没有列名:

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的预处理工作,但如果你有更优雅和快速的解决方案,那么让我知道!

2 个答案:

答案 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