推断数字类型的头名称pandas数据帧

时间:2017-09-11 10:27:11

标签: python pandas

ID         91  57 60  79  888 111
06/03/2015  1   2   2   4   1   1
03/03/2015  1   2   2   2   2   3
06/04/2015  1   2   2   2   1   1
17/04/2015  1   3   2   2   1   3
21/04/2015  3   2   1   1   2   1
12/05/2015  1   3   2   2   2   3

我有一个csv文件,其中包含ID(数值)列和某些日期为每个ID分配的值(1-4)。最后,我希望以下列格式获得数据:

    Date       Score ID
    06/03/2015  1   91
    03/03/2015  1   91
    06/04/2015  1   91
    17/04/2015  1   91
    21/04/2015  3   91
    12/05/2015  1   91     
    06/03/2015  2   57
    03/03/2015  2   57
    06/04/2015  2   57  
    17/04/2015  3   57  
    21/04/2015  2   57  
    12/05/2015  3   57

等...

尝试:

我的想法是首先创建一个pandas数据帧,如下所示:

df = pd.read_csv("file.csv", sep=', ', delimiter=None, header='infer')

我遇到的问题是infer似乎无法检测到标题名称,因为值是数字?

从这里开始,我希望能够执行数据帧操作以将数据转换为所需的格式

2 个答案:

答案 0 :(得分:1)

如有必要,请使用melt重命名列:

#s\+ is space separator, if necessary change it
df = pd.read_csv("file.csv", sep='\s+')

d = {'ID':'Date'}
cols = ['Date','Score','ID']
df = df.rename(columns=d).melt('Date', var_name='ID', value_name='Score')[cols]

#convert ID column to int
df['ID'] = df['ID'].astype(int)
print (df)
         Date  Score   ID
0  2015-06-03      1   91
1  2015-03-03      1   91
2  2015-06-04      1   91
3  2015-04-17      1   91
4  2015-04-21      3   91
5  2015-12-05      1   91
6  2015-06-03      2   57
7  2015-03-03      2   57
8  2015-06-04      2   57
...

但如果第一列是索引,则可以使用unstack

df = pd.read_csv("file.csv", sep='\s+', index_col=[0], parse_dates=[0])

然后可以将所有列转换为int:

df.columns = df.columns.astype(int)

cols = ['Date','Score','ID']
df = df.unstack().rename_axis(('ID','Date')).reset_index(name='Score')[cols]
print (df)

         Date  Score   ID
0  2015-06-03      1   91
1  2015-03-03      1   91
2  2015-06-04      1   91
3  2015-04-17      1   91
4  2015-04-21      3   91
5  2015-12-05      1   91
6  2015-06-03      2   57
...
...

答案 1 :(得分:1)

您可以使用pandas.melt

例如:

Thread.Sleep(3000)

输出:

  

ID变量值

     

06/03/2015 91 1

     

03/03/2015 91 1

     

06/04/2015 91 1

     

06/03/2015 57 2