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

Oni*_*iwa 3 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
Run Code Online (Sandbox Code Playgroud)

我使用以下方式阅读了 csv:

import pandas as pd

df = pd.read_csv('foo.csv', sep='\t')
Run Code Online (Sandbox Code Playgroud)

这给出了输出:

    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
Run Code Online (Sandbox Code Playgroud)

这似乎将我的列名移动了一位,并导致我的最后一列填充了 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)])
Run Code Online (Sandbox Code Playgroud)

我得到以下输出:

    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      
Run Code Online (Sandbox Code Playgroud)

另外,如果我尝试只抓取两个特定的列,它似乎可以正确地抓取它们。如 df = df = pd.read_csv("foo.csv", sep="\t", usecols=[3, 8]) 中所示,将正确抓取时间(秒)列和伏特列。

我希望有一种方法可以正确地构建数据,而不需要我读两次。

提前致谢!

大庭

DSM*_*DSM 6

看起来有一些尾随标签:

>>> 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'
Run Code Online (Sandbox Code Playgroud)

结果,pandas 得出结论,存在一个索引列。我们可以使用 来告诉它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  
Run Code Online (Sandbox Code Playgroud)

我们可以用

>>> 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  
Run Code Online (Sandbox Code Playgroud)