Как проверить, находится ли каждая строка одного файла в другом файле Python - PullRequest
0 голосов
/ 08 июня 2018

file1:

2018-06-07, AAA, 26543.0, 123, 0.0
2018-06-07, AAA, 26512.0, 123, 1.0

file2:

20180608, B, 12345, 343, 0
20180607, AAA, 26512, 123, 1
20180608, C, 123, 343, 0
20180607, AAA, 26543, 123, 0

Прямо сейчас я могу найти один способ, для каждой строки в file1, я просто обрабатываю его и пытаюсь найтисовпадающая строка в файле2.Однако это решение может потенциально иметь некоторые проблемы, так как мы имеем дело с относительно большими данными, этот метод (алгоритм) может быть очень медленным.

  1. Мне интересно, есть ли какая-нибудь встроенная библиотека Pythonэто позволяет мне легко это проверить, как Pandas ... (примечание: формат данных, тип для второго и последнего полей различны, но данные одинаковы)
  2. Если ни одна библиотека не позволяет мне это сделатьЭтот материал напрямую, есть ли лучший алгоритм, который позволяет мне достичь цели?Спасибо

1 Ответ

0 голосов
/ 08 июня 2018

У вас есть несколько доступных вариантов в зависимости от размера ваших DataFrame и именно того, что вы хотите.

Во-первых, получите даты в том же формате, используя pd.to_datetime.Также убедитесь, что столбцы имеют одинаковые имена в каждом df

import pandas as pd
df1['date'] = pd.to_datetime(df1['date'])
df2['date'] = pd.to_datetime(df2['date'], format='%Y%m%d')

print(df1)
        date val1     val2  val3  val4
0 2018-06-07  AAA  26543.0   123   0.0
1 2018-06-07  AAA  26512.0   123   1.0

print(df2)
        date val1   val2  val3  val4
0 2018-06-08    B  12345   343     0
1 2018-06-07  AAA  26512   123     1
2 2018-06-08    C    123   343     0
3 2018-06-07  AAA  26543   123     0

pd.merge

Вы можете выполнить слияние outer с аргументом indicator, которое затемсообщает, каким строкам соответствуют какие DataFrame с.

pd.merge(df1, df2, how='outer', indicator=True)

Выходы:

        date val1     val2  val3  val4      _merge
0 2018-06-07  AAA  26543.0   123   0.0        both
1 2018-06-07  AAA  26512.0   123   1.0        both
2 2018-06-08    B  12345.0   343   0.0  right_only
3 2018-06-08    C    123.0   343   0.0  right_only

Первые две строки отображаются как df1 и df2, а две нижниестроки появляются только в df2.Если вам нужны только общие строки, просто используйте объединение inner.

pd.merge(df1, df2, how='inner')
        date val1   val2  val3 val4
0 2018-06-07  AAA  26543   123    0
1 2018-06-07  AAA  26512   123    1

duplicated

Если df1 и df2 не содержат дублирующихся строк,затем вы можете просто объединить оба и затем найти дублированные строки в объединенном df, чтобы увидеть, какие разделены между обоими кадрами.

df = pd.concat([df1, df2])
df[df.duplicated()]

Выходы:

        date val1     val2  val3  val4
1 2018-06-07  AAA  26512.0   123   1.0
3 2018-06-07  AAA  26543.0   123   0.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...