如何用Python读取Excel(CSV)文件的指定行与列?
问题描述
我用以下Python代码将数据保存为CSV格式:
import csv with open(path + '/data_Sevol.csv', 'w', newline='') as csvfile: fieldnames = ['Sevol'] writer = csv.DictWriter(csvfile, fieldnames=fieldnames) writer.writeheader() for i in range(len(Sevol)): writer.writerow({'Sevol': Sevol[i]})
生成的CSV是100行×1列的结构,每行数据格式类似[[1, 2, 3, 4, 5]]、[[6, 7, 8, 9, 1]]。
在Jupyter Notebook中,我通过以下代码成功读取文件:
data_Sevol = pd.read_csv(path + str("\\") + str("data_Sevol.csv"))
但尝试用data_Sevol[0]或data_Sevol[1]获取第0行/第1行时,触发了KeyError: 0,报错栈如下:
KeyError Traceback (most recent call last) Input In [27], in <cell line: 1>() ----> 1 data_robs[0] File ~\anaconda3\lib\site-packages\pandas\core\frame.py:3505, in DataFrame.__getitem__(self, key) 3503 if self.columns.nlevels > 1: 3504 return self._getitem_multilevel(key) -> 3505 indexer = self.columns.get_loc(key) 3506 if is_integer(indexer): 3507 indexer = [indexer] File ~\anaconda3\lib\site-packages\pandas\core\indexes\base.py:3623, in Index.get_loc(self, key, method, tolerance) 3621 return self._engine.get_loc(casted_key) 3622 except KeyError as err: -> 3623 raise KeyError(key) from err 3624 except TypeError: 3625 # If we have a listlike key, _check_indexing_error will raise 3626 # InvalidIndexError. Otherwise we fall through and re-raise 3627 # the TypeError. 3628 self._check_indexing_error(key) KeyError: 0
需要解决如何正确读取该CSV文件的指定行与列的问题。
解决方法
原因说明
Pandas的DataFrame对象使用[]时,默认是按列名索引,而非行索引。你的CSV只有一列Sevol,所以data_Sevol['Sevol']能获取整列,但用整数0会被当作列名查找,自然触发KeyError。
1. 获取指定行
使用.iloc[]按位置索引获取行,这是最直接的方式:
# 获取第0行 row_0 = data_Sevol.iloc[0] # 获取第1行 row_1 = data_Sevol.iloc[1] # 获取多行,比如第0到第4行 rows_0_to_4 = data_Sevol.iloc[0:5]
如果你的DataFrame使用默认的整数索引(即行标签是0,1,2...),也可以用.loc[]按标签索引:
row_0 = data_Sevol.loc[0]
2. 获取指定列
你的CSV只有一列Sevol,可以直接通过列名获取:
# 获取整列数据 sevol_column = data_Sevol['Sevol'] # 获取列中指定位置的元素,比如第0行的元素 sevol_row0 = data_Sevol['Sevol'].iloc[0]
3. 优化读取与数据解析
注意你的每行数据是嵌套列表格式(比如[[1,2,3,4,5]]),读取后会被当作字符串处理。如果需要将其解析为列表对象,可以在读取时添加转换器:
import ast # 读取时解析字符串为列表 data_Sevol = pd.read_csv( path + "\\data_Sevol.csv", converters={'Sevol': ast.literal_eval} ) # 此时可以直接操作嵌套列表 first_list = data_Sevol['Sevol'].iloc[0][0] # 获取[[1,2,3,4,5]]中的[1,2,3,4,5]
4. 路径处理优化
拼接路径时可以用os.path.join或pathlib避免手动处理斜杠问题:
import os data_Sevol = pd.read_csv(os.path.join(path, "data_Sevol.csv")) # 或者用pathlib(推荐) from pathlib import Path data_Sevol = pd.read_csv(Path(path) / "data_Sevol.csv")
内容的提问来源于stack exchange,提问作者User8563
相关产品推荐
相关产品推荐

