pandas使用NAN移动列名并填充最后一列

时间:2015-07-09 14:59:26

标签: python csv pandas

我有一个以制表符分隔的csv文件。

Example:
Rec#    Cyc#    Step    Test (Sec)  Step (Sec)  Amp-hr  Watt-hr Amps    Volts   State   ES  DPt Time
1   0   1   0.00000000  0.00000000  0.00000000  0.00000000  0.00000000  3.41214609  R   0   09:44:13    
2   0   1   30.00000000 30.00000000 0.00000000  0.00000000  0.00000000  3.41077280  R   1   09:44:43    
3   0   1   60.00000000 60.00000000 0.00000000  0.00000000  0.00000000  3.41077280  R   1   09:45:13

我在使用中阅读了csv:

import pandas as pd

df = pd.read_csv('foo.csv', sep='\t')

这给出了输出:

    Rec#  Cyc#     Step  Test (Sec)  Step (Sec)    Amp-hr   Watt-hr      Amps  Volts  State      ES  DPt Time
1      0     1     0.00        0.00    0.000000  0.000000  0.000000  3.412146   R      0  09:44:13       NaN
2      0     1    30.00       30.00    0.000000  0.000000  0.000000  3.410773   R      1  09:44:43       NaN
3      0     1    60.00       60.00    0.000000  0.000000  0.000000  3.410773   R      1  09:45:13       NaN

这似乎已经将我的列名改为一,并导致我的最后一列填充NAN而不是日期。

如果我执行以下操作:

import pandas as pd

df = pd.read_csv("foo.csv", sep="\t")
df = pd.read_csv("foo.csv", sep="\t", usecols=df[:len(df.columns)])

我得到以下输出:

    Rec#  Cyc#   Step  Test (Sec)  Step (Sec) Amp-hr   Watt-hr      Amps  Volts  State    ES  DPt Time
1   1      0     1     0.00        0.00    0.000000  0.000000  0.000000  3.412146   R      0  09:44:13
2   2      0     1    30.00       30.00    0.000000  0.000000  0.000000  3.410773   R      1  09:44:43
3   3      0     1    60.00       60.00    0.000000  0.000000  0.000000  3.410773   R      1  09:45:13      

此外,如果我尝试抓住两个特定的列,它似乎正确地抓住它们。如在df = df = pd.read_csv(“foo.csv”,sep =“\ t”,usecols = [3,8])将正确获取时间(秒)列和伏特列。

我希望有一种方法能够正确构建不需要我阅读两次的数据。

提前致谢!

Oniwa

1 个答案:

答案 0 :(得分:4)

看起来有一些尾随标签:

>>> with open("oniwa.dat") as fp:
...     for line in fp:
...         print(repr(line))
...         
'Rec#\tCyc#\tStep\tTest (Sec)\tStep (Sec)\tAmp-hr\tWatt-hr\tAmps\tVolts\tState\tES\tDPt Time\n'
'1\t0\t1\t0.00000000\t0.00000000\t0.00000000\t0.00000000\t0.00000000\t3.41214609\tR\t0\t09:44:13\t\n'
'2\t0\t1\t30.00000000\t30.00000000\t0.00000000\t0.00000000\t0.00000000\t3.41077280\tR\t1\t09:44:43\t\n'
'3\t0\t1\t60.00000000\t60.00000000\t0.00000000\t0.00000000\t0.00000000\t3.41077280\tR\t1\t09:45:13\n'

结果,熊猫总结出一个索引列。我们可以使用index_col来告诉它。具体而言,而不是

>>> pd.read_csv("oniwa.dat", sep="\t") # no good
   Rec#  Cyc#  Step  Test (Sec)  Step (Sec)  Amp-hr  Watt-hr      Amps Volts  \
1     0     1     0           0           0       0        0  3.412146     R   
2     0     1    30          30           0       0        0  3.410773     R   
3     0     1    60          60           0       0        0  3.410773     R   

   State        ES  DPt Time  
1      0  09:44:13       NaN  
2      1  09:44:43       NaN  
3      1  09:45:13       NaN  

我们可以使用

>>> pd.read_csv("oniwa.dat", sep="\t", index_col=False) # hooray!
   Rec#  Cyc#  Step  Test (Sec)  Step (Sec)  Amp-hr  Watt-hr  Amps     Volts  \
0     1     0     1           0           0       0        0     0  3.412146   
1     2     0     1          30          30       0        0     0  3.410773   
2     3     0     1          60          60       0        0     0  3.410773   

  State  ES  DPt Time  
0     R   0  09:44:13  
1     R   1  09:44:43  
2     R   1  09:45:13