我有一个下载 csv 文件的 URL,要打开它,我使用以下代码:
df = pd.read_csv(url)
我使用的大多数 URL 只包含一个表,并且它们可以正常打开,但有些具有以下格式,会导致错误:| ||csv 文件被一组两个空行分成两个表。
代码当前返回以下错误:
我试图读取两个表,然后将它们组合成一个表,例如下列的:
ParserError: Error tokenizing data. C error: Expected 4 fields in line 9, saw 5
I am trying to read in both tables and then combine them into one table such as the following:
你可以使用
pandas
库中的
read_csv
函数和一些数据处理技巧来读取和合并具有多个表的 csv 文件。以下是实现此目的的步骤:
1. 读取 csv 文件中的所有表:
import pandas as pd
import io
import requests
# 从 URL 读取 csv 文件内容
url = 'your_csv_url_here' # 用你的实际 URL 替换
response = requests.get(url)
response.raise_for_status() # 检查请求是否成功
# 使用 StringIO 将内容作为文件对象读取
content = io.StringIO(response.text)
# 使用 read_csv 读取所有表,并使用空行作为分隔符
all_dfs = pd.read_csv(content, header=None, sep='\s+', engine='python', skip_blank_lines=False)
这将创建一个包含所有表的 DataFrame 列表,每个表都作为一个单独的 DataFrame。
2. 识别表边界并提取表:
# 找到空行的索引
blank_rows = all_dfs[all_dfs.isnull().all(axis=1)].index
# 创建一个表列表
tables = []
start = 0
for i in range(len(blank_rows)):
end = blank_rows[i]
tables.append(all_dfs.iloc[start:end])
start = end + 1
tables.append(all_dfs.iloc[start:]) # 添加最后一个表
这会将数据帧列表拆分为包含单个表的列表。
3. 合并表:
# 假设第一个表包含列名,并将所有其他表附加到第一个表
final_df = tables[0].copy()
final_df.columns = final_df.iloc[0]
final_df = final_df[1:]
for df in tables[1:]:
df.columns = final_df.columns
final_df = pd.concat([final_df, df], ignore_index=True)
这会将所有表合并到一个 DataFrame 中,并将第一个表的标题用作最终 DataFrame 的列名。
完整代码:
import pandas as pd
import io
import requests
url = 'your_csv_url_here'
response = requests.get(url)
response.raise_for_status()
content = io.StringIO(response.text)
all_dfs = pd.read_csv(content, header=None, sep='\s+', engine='python', skip_blank_lines=False)
blank_rows = all_dfs[all_dfs.isnull().all(axis=1)].index
tables = []
start = 0
for i in range(len(blank_rows)):
end = blank_rows[i]
tables.append(all_dfs.iloc[start:end])
start = end + 1
tables.append(all_dfs.iloc[start:])
final_df = tables[0].copy()
final_df.columns = final_df.iloc[0]
final_df = final_df[1:]
for df in tables[1:]:
df.columns = final_df.columns
final_df = pd.concat([final_df, df], ignore_index=True)
print(final_df)
这会创建一个包含所有数据且格式正确的单个 DataFrame。请记住用你的实际 csv 文件 URL 替换
'your_csv_url_here'
。