#python #python-3.x #pandas #conditional #data-analysis
#python #python-3.x #pandas #условные операторы #анализ данных
Вопрос:
Я искал два разных метода для поиска повторяющегося значения столбца в df.
Сначала нужно определить, существует ли значение в столбце, основанное на условии другого столбца, в другом df. Если в df_1 любой идентификатор с одинаковыми временами в столбце time существует в df_2
например
df_1
id | time
ab23 2019-04-17 01:00:00
bv63 2019-04-16 22:00:00
df_2
id | time
ab23 2019-04-17 01:00:00
bv63 2019-04-16 22:00:00
также, чтобы проверить, существует ли тот же идентификатор в том же столбце в том же df независимо от любого другого столбца. Итак, чтобы увидеть, есть ли в df_1 какой-либо идентификатор с дубликатами в одном и том же df.
Я пытаюсь выяснить, имеют ли идентификаторы дубликаты в одном и том же df, а также исходя из условия, что они имеют одинаковый идентификатор и время в разных dfs.
Ответ №1:
Настроить пример:
import pandas as pd
df1 = pd.DataFrame({
'id':['a','a','c'],
'time':[pd.Timestamp('2019-04-17 01:00:00'),
pd.Timestamp('2019-04-18 22:00:00'),
pd.Timestamp('2019-04-16 22:00:00')]
})
df2 = pd.DataFrame({
'id':['e','f'],
'time':[pd.Timestamp('2019-04-17 01:00:00'), pd.Timestamp('2019-04-02 22:00:00')]
})
проверьте, существует ли тот же идентификатор в том же столбце в том же df независимо от любого другого столбца.
dupes = df1['id'].duplicated()
df1['id'][dupes]
Если в df_1 любой идентификатор с одинаковыми временами в столбце time существует в df_2
matches = df1['time'].isin(df2['time'])
df1['id'][matches]
Ответ №2:
Если вы хотите игнорировать данные индекса. Преобразуйте содержимое фреймов данных в наборы кортежей, содержащих столбцы:
ds1 = set([tuple(line) for line in df1.values])
ds2 = set([tuple(line) for line in df2.values])
Этот шаг также избавит от любых дубликатов во фреймах данных (индекс игнорируется)
set([(1, 2), (3, 4), (2, 3)]) # ds1
затем можно использовать методы set для поиска чего угодно. Например, чтобы найти различия:
ds1.difference(ds2)
gives: set([(1, 2), (3, 4)])
при необходимости можно вернуть это обратно в dataframe. Обратите внимание, что необходимо преобразовать set в list 1st, поскольку set нельзя использовать для построения фрейма данных:
pd.DataFrame(list(ds1.difference(ds2)))