鱼C论坛

 找回密码
 立即注册
查看: 4857|回复: 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 来个大扫除,把这些行给清理掉。下面是更新后的代码:

  1. import os
  2. import pandas as pd

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

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

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

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

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

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

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


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

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

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

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-7-19 13:18:53 | 显示全部楼层
wp231957 发表于 2024-07-19 13:18
如何检测目标表格中是否含有合并单元格  是否含有表头 ...


这是个有趣的需求!在处理 Excel 表格时,确实需要确保数据是标准化的二维表,没有合并单元格,并且可以检测是否含有表头。这里提供一些方法来检测这些情况:

### 检测是否含有合并单元格
使用 `openpyxl` 库可以方便地检测 Excel 文件中是否存在合并单元格。

### 检测是否含有表头
可以假设如果某一行的所有单元格都是字符串类型,则可能是一行表头。

下面是示例代码:

  1. import pandas as pd
  2. import openpyxl

  3. def check_for_merged_cells_and_headers(file_path):
  4.     # 检查是否有合并单元格
  5.     wb = openpyxl.load_workbook(file_path)
  6.     ws = wb.active

  7.     has_merged_cells = False
  8.     for merged_cell in ws.merged_cells.ranges:
  9.         has_merged_cells = True
  10.         break

  11.     # 检查是否有表头(假设第一行是表头)
  12.     df = pd.read_excel(file_path, header=None)

  13.     # 假设如果第一行的所有单元格都是字符串,则判定为有表头
  14.     first_row = df.iloc[0]
  15.     has_header = all(isinstance(cell, str) for cell in first_row)

  16.     return has_merged_cells, has_header

  17. # 读取文件路径
  18. file_path = 'example.xlsx'

  19. has_merged_cells, has_header = check_for_merged_cells_and_headers(file_path)

  20. if has_merged_cells or has_header:
  21.     print("请提供标准二维表,不含表头,不含合并单元格")
  22. else:
  23.     print("表格格式正确,可以处理")
复制代码


### 解释:
1. **检查合并单元格**:使用 `openpyxl` 库加载工作簿,然后检查活动工作表中的合并单元格区域。
2. **检查表头**:用 `pandas` 读取 Excel 文件,并检查第一行的所有单元格是否都是字符串。

这个方法会在检测到合并单元格或表头时提示用户提供标准化的二维表。希望这可以帮到你,让你的数据处理更顺畅!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 13:18:41 | 显示全部楼层
FishC 发表于 2024-7-19 13:08
搞定这个问题!我们将更新代码,确保在合并之前处理空条目,同时避免警告信息。让我们来优化一下这段代 ...

如何检测目标表格中是否含有合并单元格  是否含有表头
if ........
print("请提供标准二维表  不含表头  不含合并单元格")
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 13:08:56 | 显示全部楼层
wp231957 发表于 2024-07-19 13:08
警告信息:
FutureWarning: The behavior of array c ...


搞定这个问题!我们将更新代码,确保在合并之前处理空条目,同时避免警告信息。让我们来优化一下这段代码:


import pandas as pd

# 读取母表和子表
mother_table_path = 'mother.xlsx'
child_table_path = 'child.xlsx'

df_mother = pd.read_excel(mother_table_path)
df_child = pd.read_excel(child_table_path)

# 确保A列和B列数据的一致性,转为字符串并去除空格
df_mother['A'] = df_mother['A'].astype(str).str.strip()
df_mother['B'] = df_mother['B'].astype(str).str.strip()

df_child['A'] = df_child['A'].astype(str).str.strip()

# 删除母表中A列为空值的行,因为这些不能用于匹配
df_mother.dropna(subset=['A'], inplace=True)

# 合并子表和母表,基于A列
merged_df = pd.merge(df_child[['A']], df_mother[['A', 'B']], on='A', how='left', suffixes=('_child', '_mother'))

# 使用母表的数据填充子表的空值
df_child['B'] = merged_df['B'].combine_first(df_child['B'])

# 保存更新后的数据到子表文件
df_child.to_excel(child_table_path, index=False)

print("子表已根据母表数据更新并保存!")

这段代码做了以下改进:

1. 确保 A 和 B 列的一致性,全部转为字符串并去除空格。
2. 删除母表中 A 列为空值的行。
3. 在合并时只选择需要的列,减少不必要的数据处理。
4. 使用 `combine_first` 函数更新子表中的 B 列。

这样可以避免未来版本的警告信息,并确保代码运行正常。希望这次能顺利完成任务!如果还有什么需求或问题,请随时告诉我。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 13:08:44 | 显示全部楼层
FishC 发表于 2024-7-19 12:59
明白了,这个警告和未来版本的 `pandas` 在处理空条目时的行为是有关的。我们需要提前处理这些情况,确 ...

警告信息:
FutureWarning: The behavior of array concatenation with empty entries is deprecated. In a future version, this will no longer exclude empty items when determining the result dtype. To retain the old behavior, exclude the empty entries before the concat operation.
  df_child['成绩'] = merged_df['成绩_mother'].combine_first(df_child['成绩'])
子表已根据母表数据更新并保存!

代码:

import pandas as pd

# 读取母表和子表
mother_table_path = 'mother.xlsx'
child_table_path = 'child.xlsx'

df_mother = pd.read_excel(mother_table_path)
df_child = pd.read_excel(child_table_path)
# 删除母表和子表中的空条目,确保合并时不会因为空条目而产生问题
df_mother.dropna(subset=['姓名'], inplace=True)
df_child.dropna(subset=['姓名'], inplace=True)
# 合并子表和母表,基于A列
merged_df = pd.merge(df_child, df_mother[['姓名', '成绩']], on='姓名', how='left', suffixes=('_child', '_mother'))
# 使用母表的数据填充子表的空值
df_child['成绩'] = merged_df['成绩_mother'].combine_first(df_child['成绩'])
df_child.to_excel(child_table_path, index=False)

print("子表已根据母表数据更新并保存!")

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 12:59:46 | 显示全部楼层
wp231957 发表于 2024-07-19 12:59
成功,但是收到一条警告
FutureWarning: The behavi ...


明白了,这个警告和未来版本的 `pandas` 在处理空条目时的行为是有关的。我们需要提前处理这些情况,确保代码在将来的版本中也能顺利运行。

因此,我们在合并操作之前,可以先处理空条目;具体来说是排除掉那些空条目,再进行合并操作。下面是更新后的代码:

  1. import pandas as pd

  2. # 读取母表和子表
  3. mother_table_path = 'mother.xlsx'
  4. child_table_path = 'child.xlsx'

  5. df_mother = pd.read_excel(mother_table_path)
  6. df_child = pd.read_excel(child_table_path)

  7. # 删除母表和子表中的空条目,确保合并时不会因为空条目而产生问题
  8. df_mother.dropna(subset=['A列'], inplace=True)
  9. df_child.dropna(subset=['A列'], inplace=True)

  10. # 合并子表和母表,基于A列
  11. merged_df = pd.merge(df_child, df_mother[['A列', 'B列']], on='A列', how='left', suffixes=('_child', '_mother'))

  12. # 使用母表的数据填充子表的空值
  13. df_child['B列'] = merged_df['B列_mother'].combine_first(df_child['B列'])

  14. # 保存更新后的子表
  15. df_child.to_excel(child_table_path, index=False)

  16. print("子表已根据母表数据更新并保存!")
复制代码


这下应该可以消除警告,并且直接在子表上进行修改。试试看,如果还有其他问题,随时告诉我!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 12:59:36 | 显示全部楼层
FishC 发表于 2024-7-19 12:54
明白了!我们希望直接在子表上更新,不创建额外的数据框。那我们就要仔细处理合并结果,确保最后的更新 ...

成功,但是收到一条警告
FutureWarning: The behavior of array concatenation with empty entries is deprecated. In a future version, this will no longer exclude empty items when determining the result dtype. To retain the old behavior, exclude the empty entries before the concat operation.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 12:54:38 | 显示全部楼层
wp231957 发表于 2024-07-19 12:53
这样没有问题
可是  多了一个多余的表
我们期望的是 ...


明白了!我们希望直接在子表上更新,不创建额外的数据框。那我们就要仔细处理合并结果,确保最后的更新操作是直接作用在原表上的。

下面给出详细的代码示例:

  1. import pandas as pd

  2. # 读取母表和子表
  3. mother_table_path = 'mother.xlsx'
  4. child_table_path = 'child.xlsx'

  5. df_mother = pd.read_excel(mother_table_path)
  6. df_child = pd.read_excel(child_table_path)

  7. # 合并子表和母表,基于A列
  8. merged_df = pd.merge(df_child, df_mother[['A列', 'B列']], on='A列', how='left', suffixes=('_child', '_mother'))

  9. # 更新子表的B列,如果B列_child为空,则用B列_mother的值填充
  10. df_child['B列'] = merged_df['B列_child'].combine_first(merged_df['B列_mother'])

  11. # 将更新后的子表保存回原来的Excel文件
  12. df_child.to_excel(child_table_path, index=False)

  13. print(f'更新后的子表已保存到: {child_table_path}')
复制代码


这样,`child.xlsx` 文件中的 B 列会被从 `mother.xlsx` 文件中找到的数据填充。如果母表中不存在对应数据,则保持原来的值。

简化一下流程:
1. **读取两个表格**:母表和子表。
2. **进行合并**:基于 A 列(主键)进行合并。
3. **填充空值**:使用母表中的 B 列值填充子表中的 B 列。
4. **保存结果**:将子表保存为原文件,覆盖原文件内容。

希望这次能满足你的需求!如果还有进一步的问题,欢迎继续提问哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 12:53:25 | 显示全部楼层
FishC 发表于 2024-7-19 12:21
哇,这就像在做实验时遇到了化学反应的小惊喜。我们可以解决这个问题,确保代码不仅能够顺利运行,还能 ...

这样没有问题
可是  多了一个多余的表
我们期望的是:在原表上修改或更新  child_table_path = 'child.xlsx'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 12:21:52 | 显示全部楼层
wp231957 发表于 2024-07-19 12:19
执行到这里时,抛出一个异常,但是后面的更新 也更新 ...


哇,这就像在做实验时遇到了化学反应的小惊喜。我们可以解决这个问题,确保代码不仅能够顺利运行,还能避免警告。

首先,`pandas` 的警告告诉我们,不要使用链式赋值(chained assignment)。接下来,我们将修正代码,确保它更干净、更准确。

以下是更新后的代码:

  1. import pandas as pd

  2. # 读取母表和子表
  3. mother_table_path = 'mother.xlsx'
  4. child_table_path = 'child.xlsx'

  5. df_mother = pd.read_excel(mother_table_path)
  6. df_child = pd.read_excel(child_table_path)

  7. # 合并子表和母表,基于A列
  8. merged_df = pd.merge(df_child, df_mother, on='A列', how='left', suffixes=('_child', '_mother'))

  9. # 更新子表的B列,如果B列_child为空,则用B列_mother的值填充
  10. # 使用assign和apply方法来避免链式赋值
  11. merged_df['B列'] = merged_df.apply(
  12.     lambda row: row['B列_mother'] if pd.isna(row['B列_child']) else row['B列_child'],
  13.     axis=1
  14. )

  15. # 保留子表相关的列
  16. final_df = merged_df[['A列', 'B列']]

  17. # 将结果保存回Excel文件
  18. final_df.to_excel('updated_child.xlsx', index=False)

  19. print('填充完成,结果已保存到 updated_child.xlsx')
复制代码


### 解读步骤:
1. **读取Excel文件**:直接读取母表和子表。
2. **合并数据**:使用`pd.merge`在A列上进行合并,合并方式为左连接(left join),并给合并后的列加上后缀区分。
3. **更新B列**:使用`apply`方法遍历每一行,如果`B列_child`为空,就用`B列_mother`的值填充,否则保留原来的值。
4. **保留必要列**:只保留合并后的`A列`和处理过的`B列`。
5. **保存结果**:将最终结果保存到新的Excel文件中。

这样,代码就会平稳运行,而且不会抛出链式赋值的警告。希望这个解决方案能帮到你!如果还有其他问题,随时告诉我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 12:19:38 | 显示全部楼层
FishC 发表于 2024-7-19 12:07
明白了,这个需求就像是用“魔法”把母表的值填充到子表中。我们可以使用 `pandas` 中的 `merge` 方法 ...

执行到这里时,抛出一个异常,但是后面的更新 也更新了

import pandas as pd

# 读取母表和子表
mother_table_path = 'mother.xlsx'
child_table_path = 'child.xlsx'

df_mother = pd.read_excel(mother_table_path)
df_child = pd.read_excel(child_table_path)

# 合并子表和母表,基于A列
merged_df = pd.merge(df_child, df_mother[['姓名', '成绩']], on='姓名', how='left', suffixes=('_child', '_mother'))
# 更新子表的B列,如果B列_child为空,则用B列_mother的值填充
merged_df['成绩_child'].fillna(merged_df['成绩_mother'], inplace=True)
print(merged_df)


FutureWarning: A value is trying to be set on a copy of a DataFrame or Series through chained assignment
using an inplace method.
The behavior will change in pandas 3.0. This inplace method will never work because the intermediate object on which we are setting values
always behaves as a copy.

For example, when doing 'df[col].method(value, inplace=True)', try using 'df.method({col: value}, inplace=True)' or df[col] = df[col].method(value) instead, to perform the operation inplace on the original object.
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 12:07:08 | 显示全部楼层
wp231957 发表于 2024-07-19 12:05
还有一个需求
假设有母表表M  字段为  A列  B列
子 ...


明白了,这个需求就像是用“魔法”把母表的值填充到子表中。我们可以使用 `pandas` 中的 `merge` 方法来完成这个工作。具体来说,我们将子表和母表在A列上进行合并,并将合并后的结果更新回子表中。

下面是详细的代码示例:

  1. import pandas as pd

  2. # 读取母表和子表
  3. mother_table_path = 'path_to_mother_table.xlsx'
  4. child_table_path = 'path_to_child_table.xlsx'

  5. df_mother = pd.read_excel(mother_table_path)
  6. df_child = pd.read_excel(child_table_path)

  7. # 合并子表和母表,基于A列
  8. merged_df = pd.merge(df_child, df_mother[['A列', 'B列']], on='A列', how='left', suffixes=('_child', '_mother'))

  9. # 更新子表的B列,如果B列_child为空,则用B列_mother的值填充
  10. merged_df['B列_child'].fillna(merged_df['B列_mother'], inplace=True)

  11. # 移除多余的B列_mother列
  12. merged_df.drop(columns=['B列_mother'], inplace=True)

  13. # 更新子表
  14. df_child['B列'] = merged_df['B列_child']

  15. # 保存更新后的子表
  16. updated_child_table_path = 'path_to_updated_child_table.xlsx'
  17. df_child.to_excel(updated_child_table_path, index=False)

  18. print(f'更新后的子表已保存到: {updated_child_table_path}')
复制代码


### 代码解释:
1. **读取表格**:从指定路径读取母表和子表的数据。
2. **合并数据**:使用 `pd.merge` 方法,把子表和母表基于A列进行左连接(`how='left'`),这样母表的B列会被添加到子表中。
3. **填充空值**:使用 `fillna` 方法,用母表的B列值填充子表中B列的空值。
4. **清理多余数据**:移除合并过程中多余的B列(即母表的B列)。
5. **保存结果**:将更新后的子表保存到新的Excel文件中。

这个方法确保了子表中A列对应的B列被母表中的值正确填充。希望这个解决方案可以帮到你,有任何问题请随时提问!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 12:05:58 | 显示全部楼层
FishC 发表于 2024-7-19 11:45
哈哈,下一个挑战来了!我们要找出两个表格中共有和各自独有的数据,就像在两堆乐高积木里找到相同的和 ...

还有一个需求
假设有母表表M  字段为  A列  B列
子表N  字段为A列  B列 其中B列为空值

要求  根据子表的a列值 去母表里面查找  如果找到了  用母表的b 填充子表的b  
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-19 11:45:09 | 显示全部楼层
wp231957 发表于 2024-07-19 11:44
如果在进一步需求呢
找出表a 表b 中相同的数据   就 ...


哈哈,下一个挑战来了!我们要找出两个表格中共有和各自独有的数据,就像在两堆乐高积木里找到相同的和不同的部分。让我们一起搞定它!

我们继续使用 `pandas` 来处理这个问题。下面是如何找出表A和表B中的相同数据,以及各自独有的数据的代码:

  1. import os
  2. import pandas as pd

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

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

  8. # 确保B列的数据类型一致
  9. df_a['B列'] = df_a['B列'].astype(str).str.strip()
  10. df_b['B列'] = df_b['B列'].astype(str).str.strip()

  11. # 找出表A和表B中共有的数据
  12. common_data = pd.merge(df_a, df_b, on='B列', how='inner')

  13. # 找出表A中有但表B中没有的数据
  14. a_not_in_b = df_a[~df_a['B列'].isin(df_b['B列'])]

  15. # 找出表B中有但表A中没有的数据
  16. b_not_in_a = df_b[~df_b['B列'].isin(df_a['B列'])]

  17. # 保存结果到新的Excel文件中
  18. common_data.to_excel(os.path.join(folder_path, 'common_data.xlsx'), index=False)
  19. a_not_in_b.to_excel(os.path.join(folder_path, 'a_not_in_b.xlsx'), index=False)
  20. b_not_in_a.to_excel(os.path.join(folder_path, 'b_not_in_a.xlsx'), index=False)

  21. print('操作完成:')
  22. print(f'共有数据已保存到:{os.path.join(folder_path, "common_data.xlsx")}')
  23. print(f'A表中有但B表中没有的数据已保存到:{os.path.join(folder_path, "a_not_in_b.xlsx")}')
  24. print(f'B表中有但A表中没有的数据已保存到:{os.path.join(folder_path, "b_not_in_a.xlsx")}')
复制代码


这段代码做了以下几件事:

1. 读取两个 Excel 文件。
2. 将 B列 的数据转换成字符串并删除首尾空格,确保比较时的一致性。
3. 使用 `pd.merge` 找出两个表格中共有的数据。
4. 使用 `~isin` 方法找到各自独有的数据。
5. 最后,将结果分别保存到新的 Excel 文件中。

这样,你就能轻松找到共有和各自独有的数据啦!祝你接下来的任务一切顺利!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-19 11:44:57 | 显示全部楼层
FishC 发表于 2024-7-19 11:41
太棒了!听到这个消息,我都忍不住想原地转个圈。找出这15条多余的数据就像在大海捞针中成功捞起所有的 ...

如果在进一步需求呢
找出表a 表b 中相同的数据   就是表a中有一部分数据是表b没有的
   而表b中也有一部分数据是表a中没有的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

  1. import os
  2. import pandas as pd

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

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

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

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

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

  17. print(f'多余的记录已保存到: {folder_path_result}')
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

15条多余的记录  全部找到  VERY GOOG !
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

  1. import os
  2. import pandas as pd

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

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

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

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

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

  16. print(f'差异数据已保存到: {output_path}')
复制代码


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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


结果不准确,可能和我的B列 的数值 有的是数值  有的是文本 有关系
如何把这个东西统一呢   或者 尾部空格啥的    最好是 都统一成文本
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  1. import os
  2. import pandas as pd

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

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

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

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

  14. print(f'表格B中多余的记录已保存到: {output_path}')
复制代码


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-23 05:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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