读取csv时, Pandas索引列名问题



我正在尝试从CSV文件中读取数据帧,其中具有列名的标题包括索引列上的名称。

示例数据我试过的代码:

# Open CSV
file= '507_002117.csv'
print(file)
df = pd.read_csv(file, header=6)
df = df.iloc[:, :11]
#print(df.dtypes)
print(df.head(5))
print(df['AlongTrack'])

返回如下内容:

Timestamp  AlongTrack  ...     Pitch  Roll
2022-03-31 21:38:30   0.000000    0.000000  ... -0.260261  0.93
2022-03-31 21:54:48   0.098491   -0.000042  ... -0.259386  0.93
2022-03-31 21:54:53   0.196983   -0.000086  ... -0.249085  0.93
2022-03-31 21:54:59   0.295475   -0.000117  ... -0.243554  0.92
2022-03-31 21:55:04   0.393967   -0.000172  ... -0.246343  0.92

如您所见,索引被正确地设置为时间戳,但是列名都被移到一个上。

我试过使用文档,关于read_csv的Pandas文档

它看起来像index_col将是票,但我似乎不能得到它的工作设置它在不同的值,但它所做的就是把东西移动了一行的索引,但标签仍然是错误的。

谁能给我指个正确的方向?谢谢你

我可以通过创建一个列名计数比逗号分隔的数据列数少一个的CSV来重现这种情况。也许这就是你的处境。这样的:

sim_csv = io.StringIO('''Timestamp,AlongTrack,Pitch,Roll
2022-03-31 21:38:30,0.000000, 0.000000,-0.260261,0.93
2022-03-31 21:54:48,0.098491,-0.000042,-0.259386,0.93
2022-03-31 21:54:53,0.196983,-0.000086,-0.249085,0.93
2022-03-31 21:54:59,0.295475,-0.000117,-0.243554,0.92
2022-03-31 21:55:04,0.393967,-0.000172,-0.246343,0.92''')
df = pd.read_csv(sim_csv)
print(df)
Timestamp  AlongTrack     Pitch  Roll
2022-03-31 21:38:30   0.000000    0.000000 -0.260261  0.93
2022-03-31 21:54:48   0.098491   -0.000042 -0.259386  0.93
2022-03-31 21:54:53   0.196983   -0.000086 -0.249085  0.93
2022-03-31 21:54:59   0.295475   -0.000117 -0.243554  0.92
2022-03-31 21:55:04   0.393967   -0.000172 -0.246343  0.92

有了正确的列标题数,我们就可以开始了:

sim_csv = io.StringIO('''Timestamp,AlongTrack,Pitch,Roll,xtra
2022-03-31 21:38:30,0.000000, 0.000000,-0.260261,0.93
2022-03-31 21:54:48,0.098491,-0.000042,-0.259386,0.93
2022-03-31 21:54:53,0.196983,-0.000086,-0.249085,0.93
2022-03-31 21:54:59,0.295475,-0.000117,-0.243554,0.92
2022-03-31 21:55:04,0.393967,-0.000172,-0.246343,0.92''')
df = pd.read_csv(sim_csv)
print(df)
Timestamp  AlongTrack     Pitch      Roll  xtra
0  2022-03-31 21:38:30    0.000000  0.000000 -0.260261  0.93
1  2022-03-31 21:54:48    0.098491 -0.000042 -0.259386  0.93
2  2022-03-31 21:54:53    0.196983 -0.000086 -0.249085  0.93
3  2022-03-31 21:54:59    0.295475 -0.000117 -0.243554  0.92
4  2022-03-31 21:55:04    0.393967 -0.000172 -0.246343  0.92

看起来逻辑是,如果CSV是一个列标题短,那么假定第一列是一个未命名的索引列。

解决这个问题的一种方法是用您想要的列名手动指定names=,包括缺少的那个列名。然后使用skiprows=跳过报头到数据。

只需添加以下代码行:

df = pd.read_csv(sim_csv)
df = df.set_index(df.columns[0]).reset_index()
df

结果:

<表类>指数时间戳AlongTrack沥青卷tbody><<tr>00.00.0-0.2602610.9310.098491-4.2 e-05-0.2593860.9320.196983-8.6 e-05-0.2490850.9330.295475-0.000117-0.2435540.9240.393967-0.000172-0.2463430.92

算出来了,傻问题。CSV文件在标题行之后只有一个回车。添加一个列可以修复它,或者使用代码:

df = pd.read_csv(file, header=6, index_col=False)

标记为false将使用标准索引结束,然后我可以将索引设置为时间戳列。谢谢!

最新更新