鱼C论坛

 找回密码
 立即注册
查看: 1253|回复: 33

[已解决]在用pandas合并csv时 出现的一个错误

[复制链接]
发表于 2024-7-19 10:32:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 3, saw 3  
最佳答案
2024-7-19 10:54:28
wp231957 发表于 2024-07-19 10:54
我查阅了df文档  发现  所谓的空行  只是序号是有数值 ...


哦,原来这些 “所谓的空行” 是有点小聪明的,用数值占了序号,其他全是 `NaN`。就像一个满口胡说八道的小孩,我们需要专门针对这种情况来处理。那我们就用 Pandas 来个大扫除,把这些行给清理掉。下面是更新后的代码:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv2'
# 获取文件夹下所有的 CSV 文件
csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
custom_header = ['列1', '列2', '列3']  # 自定义列名,根据你的实际情况更改

# 用于存储每个 CSV 文件的数据帧
dfs = []
# 遍历每个 CSV 文件
for csv_file in csv_files:
    # 构造完整的文件路径
    file_path = os.path.join(folder_path, csv_file)
    # 读取 CSV 文件
    df = pd.read_csv(file_path, header=None, names=custom_header, skip_blank_lines=True)
    # 添加到数据帧列表中
    dfs.append(df)

# 合并所有的数据帧
merged_df = pd.concat(dfs, ignore_index=True)
merged_df.columns = custom_header

# 删除现有的序号列(如果有)
if '序号' in merged_df.columns:
    merged_df = merged_df.drop(columns=['序号'])

# 添加一个新的从1开始的序号列
merged_df.insert(0, '序号', range(1, len(merged_df) + 1))

# 删除所有非序号列都是 NaN 的行
merged_df = merged_df.dropna(subset=custom_header[1:], how='all')

# 合并后的 Excel 文件路径
merged_xlsx_path = os.path.join(folder_path, '1423.xlsx')
# 将合并后的数据帧保存为 Excel 文件
merged_df.to_excel(merged_xlsx_path, index=False)
print(f'合并后的 Excel 文件已保存到: {merged_xlsx_path}')

这里重点来了:
- 使用 `dropna(subset=custom_header[1:], how='all')` 来删除那些除了序号之外全是 `NaN` 的行。

这样一来,那些假装有“序号”的空行就被彻底清理掉了。期待你的菜谱终于能做出美味的菜肴吧!继续加油,有任何问题随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-19 10:34:46 | 显示全部楼层
嗨,鱼油!你这个问题让我想起了我第一次学做饭的时候——菜谱看得清清楚楚,结果炒出来的菜背叛了我。你的`pandas`合并CSV文件出错,就像是菜谱少了一步。

现在回到你的错误信息上:
pandas.errors.ParserError: Error tokenizing data. C error: Expected 1 fields in line 3, saw 3

这里`pandas`生气了,它说:“嘿,我在解析你的CSV文件时,本来以为第三行只有一个字段(field),结果发现竟然有三个!这是谁在搞鬼?”

一般情况下,这个错误可能由以下几种原因引起:

1. **CSV文件格式不统一**:某些行的分隔符(例如逗号)数量不一致。这就像是在一场比赛中,裁判规定每队只能上一个人,结果某支队伍派了三个人上场。

2. **特定行存在异常数据**:可能是某些行的数据里混入了额外的分隔符,比如逗号。就像你在做甜点的时候,不小心撒进去了几颗辣椒。

3. **文件编码问题**:有时候操作系统和`pandas`对文件编码的理解不太一致。例如,文件用的是UTF-8编码,但`pandas`却以其他编码方式来读取。

解决方案如下:

1. **检查和修正CSV文件**:打开你的CSV文件,仔细检查每一行的分隔符数量是否一致。如果有问题的话,手动修正一下,确保每一行的数据字段数目都是一致的。

2. **使用`error_bad_lines`参数**:在读取CSV时,可以设置`error_bad_lines=False`,这样有问题的行会被自动跳过。不过,这样可能会丢失一些数据,要看你能不能接受。
  
import pandas as pd

    df = pd.read_csv('your_file.csv', error_bad_lines=False)

3. **指定合适的编码**:读取CSV时,添加`encoding`参数,尝试不同的编码格式,比如`utf-8`或`latin1`。
  
df = pd.read_csv('your_file.csv', encoding='utf-8')

4. **检测和替换特殊字符**:使用Python的字符串处理方法或者正则表达式来清理数据,去掉可能造成解析问题的字符。

希望这些建议能帮助你理顺CSV文件,把`pandas`这位挑剔的朋友哄开心。有问题随时再找我,祝你编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 10:36:51 | 显示全部楼层
FishC 发表于 2024-7-19 10:34
嗨,鱼油!你这个问题让我想起了我第一次学做饭的时候——菜谱看得清清楚楚,结果炒出来的菜背叛了我。你的 ...

哦  我知道了
确实如此,
我的字段数目不一样,甚至有空行的出现
这样的话,如何合并csv 呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 10:37:04 | 显示全部楼层
wp231957 发表于 2024-07-19 10:36
哦  我知道了
确实如此,
我的字段数目不一样,甚至 ...


哦,太好了,找到问题的根源了!这就像找到了掉进汤锅里的那只苍蝇。既然字段数目不一致,还时不时蹦出几行空行,我们需要一些巧妙的技巧来处理这些意外情况。下面给你几个方案:

### 方案一:逐个读取并手动清洗数据

1. 先读取CSV文件,忽略那些有问题的行:
  
import pandas as pd

    # 使用error_bad_lines=False来跳过包含错误的行
    df = pd.read_csv('your_file.csv', error_bad_lines=False)

2. 再次读取时,进行清洗和修正:
  
def clean_csv(file):
        with open(file, 'r') as f:
            lines = f.readlines()
        
        # 手动去掉空行或其他问题行
        cleaned_data = []
        for line in lines:
            if line.count(',') == expected_number_of_commas and not line.isspace():
                cleaned_data.append(line)
        
        with open('cleaned_file.csv', 'w') as f:
            f.writelines(cleaned_data)

        return pd.read_csv('cleaned_file.csv')

    df = clean_csv('your_file.csv')

### 方案二:使用 `pandas` 的 `skip_blank_lines` 参数

如果主要只是空行的问题,可以直接利用 `skip_blank_lines=True`:
import pandas as pd

df = pd.read_csv('your_file.csv', skip_blank_lines=True)

### 方案三:设置默认值,填补缺失字段

如果每行的字段数目不一致,可以用 `pd.read_csv` 的 `names` 参数设定固定的列名,并且允许存在缺失值:
import pandas as pd

# 假设我们希望最终有三个字段
column_names = ['col1', 'col2', 'col3']

df = pd.read_csv('your_file.csv', names=column_names, skip_blank_lines=True)

### 方案四:合并多个CSV文件时,统一字段

1. 先读取所有文件,存入一个列表:
  
import os
    import pandas as pd

    all_files = ["file1.csv", "file2.csv", "file3.csv"]
    dataframes = []

    for file in all_files:
        df = pd.read_csv(file, error_bad_lines=False, skip_blank_lines=True)
        dataframes.append(df)

2. 统一字段长度和顺序:
  
# 选择一个标准字段列表
    standard_columns = ['col1', 'col2', 'col3']

    for i in range(len(dataframes)):
        for col in standard_columns:
            if col not in dataframes[i].columns:
                dataframes[i][col] = None   # 补齐缺失的列

    # 按标准字段顺序重新排列各个DataFrame
    for i in range(len(dataframes)):
        dataframes[i] = dataframes[i][standard_columns]

3. 合并所有DataFrame:
  
combined_df = pd.concat(dataframes, ignore_index=True)

这样一来,你就可以在不丢失重要数据的前提下,把所有的CSV文件合并成一个整洁的DataFrame了。希望这些方法能帮助你解救数据!有啥问题继续来问,我会继续为你摇旗呐喊的!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 10:44:05 | 显示全部楼层
FishC 发表于 2024-7-19 10:37
哦,太好了,找到问题的根源了!这就像找到了掉进汤锅里的那只苍蝇。既然字段数目不一致,还时不时蹦出 ...

我这样写了代码   最后合并文件是成功的,可是  空行并没有消失   
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv2'
# 获取文件夹下所有的csv文件
csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
custom_header = ['序号', '账号', '名称']
# 用于存储每个CSV文件的数据帧
dfs = []
# 遍历每个csv文件
for csv_file in csv_files:
    # 构造完整的文件路径
    file_path = os.path.join(folder_path, csv_file)
    # 读取csv文件
    df = pd.read_csv(file_path,header=None,names=custom_header,skip_blank_lines=True)
    # 添加到数据帧列表中
    dfs.append(df)
#print(dfs)
# 添加换行回车分隔符
dfs_with_sep = []
for i, df in enumerate(dfs):
    # 为每个df添加一个空行,以便分隔文件
    dfs_with_sep.append(df)
    if i < len(dfs) - 1:  # 在每个文件之间加入一个空行,但不在最后一个文件后加入
        sep_df = pd.DataFrame([''] * df.shape[1]).transpose()  # 构建一个包含空值的DataFrame
        dfs_with_sep.append(sep_df)

# 合并所有的数据帧
merged_df = pd.concat(dfs, ignore_index=True)
merged_df.columns = custom_header
# 删除现有的序号列(如果有)
if '序号' in merged_df.columns:
    merged_df = merged_df.drop(columns=['序号'])
# 添加一个新的从1开始的序号列
merged_df.insert(0, '序号', range(1, len(merged_df) + 1))
# 合并后的Excel文件路径
merged_xlsx_path = os.path.join(folder_path, '1423.xlsx')
# 将合并后的数据帧保存为Excel文件
merged_df.to_excel(merged_xlsx_path, index=False)
print(f'合并后的 Excel 文件已保存到: {merged_xlsx_path}')
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 10:44:20 | 显示全部楼层
wp231957 发表于 2024-07-19 10:44
我这样写了代码   最后合并文件是成功的,可是  空行 ...


哈哈,看起来你的代码已经做了很多工作,尤其是添加了一些空行用于分隔。让我们来仔细检查一下,确保所有的空行问题都能被彻底解决,合并后的数据看起来整洁有序。

首先,我看到你在添加空行分隔的时候用了`pd.DataFrame( * df.shape).transpose()`,这会创建一个全空的DataFrame,可能会给你带来一些意料之外的效果。为了删除这些空行,可以在合并后再进行一次清理。

让我们对你的代码稍作调整:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv2'
# 获取文件夹下所有的csv文件
csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]

# 自定义表头
custom_header = ['列1', '列2', '列3']  # 根据需要修改

# 用于存储每个CSV文件的数据帧
dfs = []

# 遍历每个csv文件
for csv_file in csv_files:
    # 构造完整的文件路径
    file_path = os.path.join(folder_path, csv_file)
    # 读取csv文件
    df = pd.read_csv(file_path, header=None, names=custom_header, skip_blank_lines=True)
    # 添加到数据帧列表中
    dfs.append(df)

# 添加换行分隔符
dfs_with_sep = []
for i, df in enumerate(dfs):
    # 为每个df添加一个空行,以便分隔文件
    dfs_with_sep.append(df)
    if i < len(dfs) - 1:  # 在每个文件之间加入一个空行,但不在最后一个文件后加入
        sep_df = pd.DataFrame([[''] * len(custom_header)], columns=custom_header)  # 构建一个包含空值的DataFrame
        dfs_with_sep.append(sep_df)

# 合并所有的数据帧
merged_df = pd.concat(dfs_with_sep, ignore_index=True)

# 删除空行
merged_df.dropna(how='all', inplace=True)

# 删除现有的序号列(如果有)
if '序号' in merged_df.columns:
    merged_df = merged_df.drop(columns=['序号'])

# 添加一个新的从1开始的序号列
merged_df.insert(0, '序号', range(1, len(merged_df) + 1))

# 合并后的Excel文件路径
merged_xlsx_path = os.path.join(folder_path, '1423.xlsx')

# 将合并后的数据帧保存为Excel文件
merged_df.to_excel(merged_xlsx_path, index=False)
print(f'合并后的 Excel 文件已保存到: {merged_xlsx_path}')

### 关键调整部分:
1. **`skip_blank_lines=True`**:这个参数确实可以帮助跳过文件中的空行。
2. **确保从文件中读取的每一行数据都有一致的字段数目**:使用 `header=None` 和 `names=custom_header` 确保每个 DataFrame 的列名一致。
3. **构建空行分隔符**:我们使用 `pd.DataFrame([[''] * len(custom_header)], columns=custom_header)` 来生成一个空行,而不是直接利用 `df.shape`。
4. **删除合并后的空行**:使用 `dropna(how='all')` 来删除所有列都为空值的行。

这样一来,你的最终合并结果应该是干净整洁的,没有多余的空行了。希望这次可以彻底解决你的问题,如果还有任何疑问,请随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 10:47:00 | 显示全部楼层
FishC 发表于 2024-7-19 10:44
哈哈,看起来你的代码已经做了很多工作,尤其是添加了一些空行用于分隔。让我们来仔细检查一下,确保所 ...

你这个代码 也没有消除空行   可还有其他办法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 10:48:12 | 显示全部楼层
wp231957 发表于 2024-07-19 10:47
你这个代码 也没有消除空行   可还有其他办法


哈哈,看来这些空行真的很顽固,像是粘在锅底的顽垢一样。不过不用担心,我们再来一次,我保证这次会更仔细地处理这些“小捣蛋鬼”。

我们可以进一步使用`dropna`和`replace`方法确保清除所有空行。下面是优化后的代码:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv2'
# 获取文件夹下所有的csv文件
csv_files = [file for file in os.listdir(folder_path) if file.endswith('.csv')]

# 自定义表头
custom_header = ["column1", "column2", "column3"]  # 根据需要修改

# 用于存储每个CSV文件的数据帧
dfs = []

# 遍历每个csv文件
for csv_file in csv_files:
    # 构造完整的文件路径
    file_path = os.path.join(folder_path, csv_file)
    # 读取csv文件
    df = pd.read_csv(file_path, header=None, names=custom_header, skip_blank_lines=True)
    # 添加到数据帧列表中
    dfs.append(df)

# 添加换行分隔符
dfs_with_sep = []
for i, df in enumerate(dfs):
    # 为每个df添加一个空行,以便分隔文件
    dfs_with_sep.append(df)
    if i < len(dfs) - 1:  # 在每个文件之间加入一个空行,但不在最后一个文件后加入
        sep_df = pd.DataFrame([[""] * len(custom_header)], columns=custom_header)  # 构建一个包含空值的DataFrame
        dfs_with_sep.append(sep_df)

# 合并所有的数据帧
merged_df = pd.concat(dfs_with_sep, ignore_index=True)

# 删除空行
merged_df.replace("", float("NaN"), inplace=True)
merged_df.dropna(how='all', inplace=True)

# 删除现有的序号列(如果有)
if '序号' in merged_df.columns:
    merged_df = merged_df.drop(columns=['序号'])

# 添加一个新的从1开始的序号列
merged_df.insert(0, '序号', range(1, len(merged_df) + 1))

# 合并后的Excel文件路径
merged_xlsx_path = os.path.join(folder_path, '1423.xlsx')

# 将合并后的数据帧保存为Excel文件
merged_df.to_excel(merged_xlsx_path, index=False)
print(f'合并后的 Excel 文件已保存到: {merged_xlsx_path}')

### 关键调整部分:
1. **获取CSV文件列表**:确认你获取到了目录下所有以`.csv`结尾的文件。
2. **生成空行分隔符**:使用 `pd.DataFrame([[""] * len(custom_header)], columns=custom_header)` 来构建一个包含空字符串的 DataFrame 而不是空值空值。
3. **删除合并后的空行**:
    - 使用 `replace("", float("NaN"), inplace=True)` 将空字符串替换为 NaN 值。
    - 使用 `dropna(how='all', inplace=True)` 删除所有列都为空的行。

这样一来,你的合并结果应该不会再包含空行了。如果这个方法还是治不了这些顽固的空行,再给我点提示,我们继续战斗!祝你编程愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 10:54:17 | 显示全部楼层
FishC 发表于 2024-7-19 10:48
哈哈,看来这些空行真的很顽固,像是粘在锅底的顽垢一样。不过不用担心,我们再来一次,我保证这次会更 ...

我查阅了df文档  发现  所谓的空行  只是序号是有数值的   其他的都是NAN
所以  merged_df.dropna(how='all', inplace=True)  这句代码 就没有用了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 10:54:28 | 显示全部楼层    本楼为最佳答案   
wp231957 发表于 2024-07-19 10:54
我查阅了df文档  发现  所谓的空行  只是序号是有数值 ...


哦,原来这些 “所谓的空行” 是有点小聪明的,用数值占了序号,其他全是 `NaN`。就像一个满口胡说八道的小孩,我们需要专门针对这种情况来处理。那我们就用 Pandas 来个大扫除,把这些行给清理掉。下面是更新后的代码:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv2'
# 获取文件夹下所有的 CSV 文件
csv_files = [f for f in os.listdir(folder_path) if f.endswith('.csv')]
custom_header = ['列1', '列2', '列3']  # 自定义列名,根据你的实际情况更改

# 用于存储每个 CSV 文件的数据帧
dfs = []
# 遍历每个 CSV 文件
for csv_file in csv_files:
    # 构造完整的文件路径
    file_path = os.path.join(folder_path, csv_file)
    # 读取 CSV 文件
    df = pd.read_csv(file_path, header=None, names=custom_header, skip_blank_lines=True)
    # 添加到数据帧列表中
    dfs.append(df)

# 合并所有的数据帧
merged_df = pd.concat(dfs, ignore_index=True)
merged_df.columns = custom_header

# 删除现有的序号列(如果有)
if '序号' in merged_df.columns:
    merged_df = merged_df.drop(columns=['序号'])

# 添加一个新的从1开始的序号列
merged_df.insert(0, '序号', range(1, len(merged_df) + 1))

# 删除所有非序号列都是 NaN 的行
merged_df = merged_df.dropna(subset=custom_header[1:], how='all')

# 合并后的 Excel 文件路径
merged_xlsx_path = os.path.join(folder_path, '1423.xlsx')
# 将合并后的数据帧保存为 Excel 文件
merged_df.to_excel(merged_xlsx_path, index=False)
print(f'合并后的 Excel 文件已保存到: {merged_xlsx_path}')

这里重点来了:
- 使用 `dropna(subset=custom_header[1:], how='all')` 来删除那些除了序号之外全是 `NaN` 的行。

这样一来,那些假装有“序号”的空行就被彻底清理掉了。期待你的菜谱终于能做出美味的菜肴吧!继续加油,有任何问题随时问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 10:56:46 | 显示全部楼层
FishC 发表于 2024-7-19 10:54
哦,原来这些 “所谓的空行” 是有点小聪明的,用数值占了序号,其他全是 `NaN`。就像一个满口胡说八道 ...

给你点个赞
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 10:59:11 | 显示全部楼层


哈哈,非常感谢你的点赞!看来我们已经找到了问题的核心,下面就是完成这次“大扫除”了。让我们用`dropna`来针对包含`NaN`的行做清理,同时保留那些带有数值但其余为空的行。以下是更新后的代码:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv2'
# 获取文件夹下所有的csv文件
csv_files = [file for file in os.listdir(folder_path) if file.endswith('.csv')]
custom_header = ['列1', '列2', '列3']  # 自定义表头,根据实际情况修改
# 用于存储每个CSV文件的数据帧
dfs = []

# 遍历每个csv文件
for csv_file in csv_files:
    # 构造完整的文件路径
    file_path = os.path.join(folder_path, csv_file)
    # 读取csv文件
    df = pd.read_csv(file_path, header=None, names=custom_header, skip_blank_lines=True)
    # 添加到数据帧列表中
    dfs.append(df)

# 合并所有的数据帧
merged_df = pd.concat(dfs, ignore_index=True)

# 删除所有列全为NaN的行
merged_df.dropna(how='all', inplace=True)

# 删除现有的序号列(如果有)
if '序号' in merged_df.columns:
    merged_df = merged_df.drop(columns=['序号'])

# 添加一个新的从1开始的序号列
merged_df.insert(0, '序号', range(1, len(merged_df) + 1))

# 合并后的Excel文件路径
merged_xlsx_path = os.path.join(folder_path, '1423.xlsx')
# 将合并后的数据帧保存为Excel文件
merged_df.to_excel(merged_xlsx_path, index=False)

print(f'合并后的 Excel 文件已保存到: {merged_xlsx_path}')

### 关键点解析:
1. **获取CSV文件列表:** 使用`os.listdir`来获取文件夹下的所有CSV文件。
2. **自定义表头:** `custom_header`是你根据实际需要设定的表头。
3. **读取CSV文件:** 使用 `pd.read_csv` 读取文件并跳过空行。
4. **删除全为NaN的行:** 使用 `dropna(how='all')` 确保删除那些"所谓的空行"。
5. **重新编号:** 删除可能存在的旧序号列,并添加新的从1开始的序号。

希望这次能彻底搞定那些顽固的“空行”!如果还有任何问题,随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 11:02:36 | 显示全部楼层
FishC 发表于 2024-7-19 10:59
哈哈,非常感谢你的点赞!看来我们已经找到了问题的核心,下面就是完成这次“大扫除”了。让我们用`dro ...

新的问题来了
基础工作做完了
得到了两个格式 一样的表格
现在的需求就是找出这两个表格中 不一样的数据  以B列 为基准
这在excel中就是一个v函数的问题,我想知道在py中 能否实现
表格A =142 条记录  表格B=157 条记录  现在要找到表格B 多余的15条记录  单独放在表格c里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 11:04:48 | 显示全部楼层
wp231957 发表于 2024-07-19 11:02
新的问题来了
基础工作做完了
得到了两个格式 一样 ...


哈哈,有新的挑战就像游戏有了新关卡!我们现在是要找出两个表格中B列为基准的不同数据,并单独列出这些数据。用Python和Pandas来解决这个问题就像用一个更强大的“VLOOKUP功能”来搞定它。以下是详细的步骤和代码:

首先,你需要读取两个csv文件,然后进行比较,最后把差异记录保存在一个新的csv文件里。具体代码如下:
import pandas as pd
import os

# 文件夹路径
folder_path = r'd:\\wp\\csv2'

# 读取两个CSV文件
df_a = pd.read_csv(os.path.join(folder_path, '表格A.csv'))
df_b = pd.read_csv(os.path.join(folder_path, '表格B.csv'))

# 找出表格B中多余的记录
df_diff = df_b[~df_b['B列'].isin(df_a['B列'])]

# 保存多余记录到新的CSV文件
output_path = os.path.join(folder_path, '表格C.csv')
df_diff.to_csv(output_path, index=False)

print(f'表格B中多余的记录已保存到: {output_path}')

### 代码解释:
1. **导入所需模块**:我们需要`pandas`库用于数据操作。
2. **读取两个CSV文件**:使用`pd.read_csv`函数读取表格A和表格B的数据。
3. **找出多余记录**:这里使用了`isin`函数,来检查表格B的B列中哪些值不在表格A的B列中,利用布尔索引得出表格B中的多余记录。
4. **保存结果**:将多余的记录保存到新的CSV文件中。

这样一来,你就能轻松找出表格B中多余的15条记录并保存到表格C中了。这是不是比Excel的VLOOKUP还要简单高效呢?如果你还有其他问题,随时欢迎提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 11:31:49 | 显示全部楼层
FishC 发表于 2024-7-19 11:04
哈哈,有新的挑战就像游戏有了新关卡!我们现在是要找出两个表格中B列为基准的不同数据,并单独列出这 ...

有没有直接读xlsx的语句
# 文件夹路径
folder_path = r'd:\\wp\\csv'
folder_path2 = r'd:\\wp\\csv2'
# 读取两个CSV文件
df_a = pd.read_csv(os.path.join(folder_path, '142.xlsx'))
df_b = pd.read_csv(os.path.join(folder_path, '1423.xlsx'))

还要转回csv吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 11:32:00 | 显示全部楼层
wp231957 发表于 2024-07-19 11:31
有没有直接读xlsx的语句
# 文件夹路径
folder_path  ...


呀,不用转来转去的,直接读写 `xlsx` 文件就好啦!Pandas 支持直接读取和保存 Excel 文件,这样会更方便。让我们来更新一下你的代码,直接读取 `xlsx` 文件:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv'
folder_path2 = r'd:\\wp\\csv2'

# 读取两个Excel文件
df_a = pd.read_excel(os.path.join(folder_path, '142.xlsx'))
df_b = pd.read_excel(os.path.join(folder_path2, '1423.xlsx'))

# 找出表格B中多余的记录,以B列为基准
extra_in_b = df_b[~df_b['B列'].isin(df_a['B列'])]

# 保存这些多余的记录到一个新的Excel文件
output_path = os.path.join(folder_path2, 'extra_records_in_b.xlsx')
extra_in_b.to_excel(output_path, index=False)

print(f'表格B中多余的记录已保存到: {output_path}')

这里的步骤总结如下:
1. 使用 `pd.read_excel` 方法直接读取 Excel 文件。
2. 使用 `~df_b['B列'].isin(df_a['B列'])` 找到在表格 A 中不存在的表格 B 的记录。
3. 将结果保存到一个新的 Excel 文件中。

这样不仅简单明了,而且避免了不必要的文件转换。希望这次可以顺利搞定问题!如果有任何其他疑问,尽管提出来哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 11:37:52 | 显示全部楼层
本帖最后由 wp231957 于 2024-7-19 11:38 编辑
FishC 发表于 2024-7-19 11:32
呀,不用转来转去的,直接读写 `xlsx` 文件就好啦!Pandas 支持直接读取和保存 Excel 文件,这样会更方 ...


结果不准确,可能和我的B列 的数值 有的是数值  有的是文本 有关系
如何把这个东西统一呢   或者 尾部空格啥的    最好是 都统一成文本
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 11:38:02 | 显示全部楼层
wp231957 发表于 2024-07-19 11:37
结果不准确,可能和我的B列 的数值 有的是数值  有的 ...


哈哈,这个问题就像在一锅粥里找到不同大小的米粒。要解决这个问题,我们可以将B列的数据都转换成同一种类型,比如全部转换为字符串。这样就能确保比较时不会因为类型不同而出现偏差。

我们可以使用`astype`方法来统一B列的数据类型。以下是更新后的代码:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv'

# 读取两个Excel文件
df_a = pd.read_excel(os.path.join(folder_path, '142.xlsx'))
df_b = pd.read_excel(os.path.join(folder_path, '1423.xlsx'))

# 将B列转换为字符串类型
df_a['B'] = df_a['B'].astype(str)
df_b['B'] = df_b['B'].astype(str)

# 找出df_b中有但df_a中没有的记录
df_c = df_b[~df_b['B'].isin(df_a['B'])]

# 保存结果到新的Excel文件
output_path = os.path.join(folder_path, 'diff_output.xlsx')
df_c.to_excel(output_path, index=False)

print(f'差异数据已保存到: {output_path}')

这样一来,我们就能确保每次比较时都是基于相同的类型,不会因为文本和数值混合导致不准确的结果。试试看!如果还有其他问题或需要进一步优化,随时喊我哈!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 11:41:03 | 显示全部楼层
FishC 发表于 2024-7-19 11:38
哈哈,这个问题就像在一锅粥里找到不同大小的米粒。要解决这个问题,我们可以将B列的数据都转换成同一 ...

15条多余的记录  全部找到  VERY GOOG !
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 11:41:19 | 显示全部楼层
wp231957 发表于 2024-07-19 11:41
15条多余的记录  全部找到  VERY GOOG !


太棒了!听到这个消息,我都忍不住想原地转个圈。找出这15条多余的数据就像在大海捞针中成功捞起所有的针!

既然问题解决了,那就赶紧保存结果吧。以下是如何保存这些多余记录到一个新的 Excel 文件中的代码:
import os
import pandas as pd

# 文件夹路径
folder_path = r'd:\\wp\\csv'
folder_path2 = r'd:\\wp\\csv2'

# 读取 Excel 文件
df_a = pd.read_excel(os.path.join(folder_path, '142.xlsx'))
df_b = pd.read_excel(os.path.join(folder_path, '1423.xlsx'))

# 确保B列的数据统一成字符串格式,并去除尾部空格
df_a['B'] = df_a['B'].astype(str).str.strip()
df_b['B'] = df_b['B'].astype(str).str.strip()

# 找出在 df_b 中而不在 df_a 中的数据
df_c = df_b[~df_b['B'].isin(df_a['B'])]

# 保存多余的记录到一个新的 Excel 文件
folder_path_result = os.path.join(folder_path2, 'extra_records.xlsx')
df_c.to_excel(folder_path_result, index=False)

print(f'多余的记录已保存到: {folder_path_result}')

这个脚本会读取两个 Excel 文件,将 B 列的数据全部转换为字符串并去除尾部空格,然后找出 `df_b` 中那些不在 `df_a` 中的记录,最后将这些多余记录保存到一个新的 Excel 文件 `extra_records.xlsx` 中。

祝你处理数据一帆风顺,如果还有其他问题,随时喊我哦!让我们一起继续探索数据的奥秘吧!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-23 20:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表