【问题标题】:Advance processing multiple Data Frames in python在 python 中提前处理多个数据帧
【发布时间】:2026-01-19 19:00:01
【问题描述】:

我有几 (15) 个数据帧。它们包含基于一张地图的值,但它们具有碎片形式。

示例列表类似于A1 - 3k records, A2 - 6k records. B1 - 12k records, B2- 1k records, B3 - 3k records. C1... 等。

所有文件都有相同的格式,看起来:

name     sample    position    position_ID
String1   String1      num1        num1
String2   String2      num2        num2
...

所有文件均来自各种生物微阵列。不同的公司有不同的矩阵,因此文件大小分散。但它们中的每一个都基于一个通用的完整数据库。只选择了主数据库中的一些数据。因此,单个记录可以在文件之间重复。我想看看它们是否兼容。

我想在这项任务中实现什么目标?

我想检查所有文件中的所有记录在name 方面是否都具有相同的位置和pos_ID 值。 如果被测试的同名记录在任何文件中的值不同,则必须写入error.csv。 如果到处都是一样的 - result.csv。

老实说,我不知道如何咬它,所以我在这里被引导暗示有人正在向我提出好的建议。我想用python来做。 我有两个想法。

  1. 将所有文件作为一个数据帧加载到 Pandas 中,并尝试编写一个函数来逐条过滤整个 DF 记录(使用 if 语句进行 for 循环?)。
  2. 通过pythonread file打开分离所有文件并将唯一行添加到新列表中,当读取函数再次遇到相同的记录名称时,它会与以前的检查。如果其余的值都相同,则不写入就通过,否则,记录将写入error.csv

但是,我担心这些可能不是最理想的方法,因此向您寻求建议并指导我寻求更好的方法?我读过关于 numpy 的文章,我还没有研究过,但也许值得在这个任务的背景下进行?也许已经为此创建了一个函数,而我不知道它?

有人可以提供更明智(也许更容易)的解决方案吗?

【问题讨论】:

  • I hope that I was able to clearly outline the problem - 不。 the same positions or IDs - 为什么是 OR?为什么尺寸如此不同?我想问题实际上是关于理解数据和目标。至于工具pandas 就是你所需要的。一旦你知道你想从数据中得到什么,应用它应该很简单。
  • 好的,谢谢编辑。而且当然。尺寸与我无关。这些文件只是基因微阵列的结果,基因微阵列仅根据公司和需求检查整个地图中的特定记录。因此,一家公司的微阵列有 3k 条记录,另一家有 54k 条记录,并使用不同的记录。所以你认为我应该尝试第一个想法?还是我应该仍然使用熊猫但在分开的文件上?
  • 我同意@Poolka,问题不是很清楚。作为起点,我会将所有 csvs 读取到数据帧中。然后我会去df1["filename"] = 'file1.csv',这样我就可以跟踪一行的来源。然后我会使用df_all = pd.concat([df1,df2,etc], axis=1) 将所有数据帧合并为一个。一旦以这种形式出现,您就可以做某事。我希望这是一个好的开始?
  • @erncyp 谢谢你的建议。这是个好主意,我会试试的。 :) 关于帖子:我编辑了它,我希望现在更清楚了。

标签: python pandas csv numpy data-science


【解决方案1】:

我想我大概知道你要去哪里。这就是我的处理方式

import pandas as pd

df1 = pd.read_csv("file1.csv")
df2 = pd.read_csv("file2.csv")
df1["filename"] ="file1.csv"
df2["filename"] ="file2.csv"

df_total = pd.concat([df1,df2],axis=1) # stacks them vertically

df_total_no_dupes = df_total.drop_duplicates() # drops duplicate rows

# this gives you the cases where id occures more than once
name_counts = df_total_no_dupes.groupby("name").size().reset_index(name='counts')

names_which_appear_more_than_once = name_counts[name_counts["counts"] > 1]["name"].unique()

filter_condition = df_total_no_dupes["name"].isin(names_which_appear_more_than_once)

# this should be your dataframe where there are at least two rows with same name but different values.
print(df_total_no_dupes[filter_condition].sort_values("name"))

【讨论】: