Предварительная обработка нескольких фреймов данных в Python - PullRequest
1 голос
/ 28 марта 2019

Я получил несколько (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?).
  2. Откройте отдельные файлы с помощью python read file и добавьте уникальные строки в новый список, и когда функция чтения снова столкнется с тем же recordName, она проверит его с предыдущим.Если все остальные значения одинаковы, он пропустит их без записи, если нет, запись будет записана в error.csv.

Однако я боюсь, что они могут быть не самымиоптимальные методы, следовательно, спрашивать у вас совета и направлять меня на что-то лучшее?Я читал о NumPy, я еще не изучал его, но, может быть, стоит того, чтобы быть в контексте этой задачи?Может быть, есть функция, которая уже была создана для этого, и я не знаю об этом?

Может кто-нибудь помочь более разумным (возможно, более простым) решением?

1 Ответ

0 голосов
/ 29 марта 2019

Я думаю, что у меня есть приблизительное представление о том, куда вы идете.Вот как бы я подошел к этому

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"))
...