Извлечение уникальных строк из двух файлов данных - PullRequest
0 голосов
/ 17 октября 2018

У меня есть два больших файла Excel, и я хотел бы извлечь строки, которые являются уникальными в каждом файле.

Например, у меня есть

df1 = pd.DataFrame({'Value': [100,50,20,10],
'C1': ['a','b','c','d'],
'C2': ['g','h','i','j'],})

df2 = pd.DataFrame({'Value': [100,40,20,5],
'C1': ['a','z','c','d'],
'C2': ['g','h','i','m'],})

Первая строка и третья строка разделены междуdf1 и df2.(a, g, 100 или c, i, 20) Вторая строка и четвертая строка не являются общими для df1 и df2, и я хочу извлечь эти строки.(b, h, 50. d, j, 10. z, h, 40 и d, m, 5).

Если бы вы могли сказать мне, как сделать это с помощью Python, я был бы признателен заэто очень много.

Спасибо, ребята, за ваш отзыв.Если бы я мог получить результаты ниже, это было бы здорово.

df1only=pd.DataFrame({'Value': [50,10],'C1': ['b','d'],'C2': ['h','j'],})

df2only = pd.DataFrame({'Value': [40,5],'C1': ['z','d'],'C2': ['h','m']})

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

Использование symmetric_difference после создания tuple

set(df1.apply(tuple,1)).symmetric_difference(set(df2.apply(tuple,1)))
Out[653]: {('b', 'h', 50), ('d', 'j', 10), ('d', 'm', 5), ('z', 'h', 40)}

Или просто

set(df1.apply(tuple,1))^set(df2.apply(tuple,1))
Out[654]: {('b', 'h', 50), ('d', 'j', 10), ('d', 'm', 5), ('z', 'h', 40)}
0 голосов
/ 17 октября 2018

Вы можете, например.

1) Создать маску без дубликатов (~ инвертирует выделение).Благодаря комментарию Вена к этому решению ваши индексы должны быть выровнены.

m = ~df1.isin(df2).all(1)
# Access dataframe with one of below
#df1[m]
#df2[m]
#pd.concat([df1,df2]).loc[m]

2) Удалить дубликаты из объединенного блока данных (безотказно, если ваши значения установлены в 3)

df = pd.concat([df1,df2])
df.loc[~df.duplicated(keep=False)]

3) Вы можете в качестве варианта 2 проходалямбда-функция для определения местоположения.

df = pd.concat([df1,df2]).loc[lambda x: ~x.duplicated(keep=False)]
0 голосов
/ 17 октября 2018

Это добавит столбец по какой фильтрации в зависимости от того, где они объединяются:

merged = df1.merge(df2, indicator=True, how='outer')
final = merged[merged['_merge'] != 'both']
print(final)

Это делает правое внешнее слияние df1 и df2 и добавляет столбец, указывающий, где произошло слияние и если строкауникальный для df или присутствует только в одном или другом:

>>> merged[merged['_merge'] != 'both']
  C1 C2  Value      _merge
1  b  h     50   left_only
3  d  j     10   left_only
4  z  h     40  right_only
5  d  m      5  right_only
...