2016-02-11 2 views
0

Учитывая два кадра данных, в которых я извлекаю какое-то уникальное значение в groupby, я хочу сравнить два уникальных значения и найти значения, которые отличаются друг от друга.Определить дополнительное значение в двух сериях python или dataframes

unit1 = ["U1", "U2", "U1", "U2", "U1", "U2"] 
unit2 = ["U1", "U2", "U1", "U2", "U1", "U2, "U3"] 
count1 = [2,4,6,8,10,12] 

df = pd.DataFrame({'Unit': unit1, 
        'Count': count1}) 
df2 = pd.DataFrame({'Unit': unit2, 
        'Count': count1}) 

units_in_1 = df.groupby(['Unit']) 
unit1_list = units_in_1['Unit'].unique() 

units_in_2 = df2.groupby(['Unit']) 
unit2_list = units_in_2['Unit'].unique() 

Что я хочу в конце концов, U3, так что я могу вернуться и найти все экземпляры, которые в df2.

unit1_list - это серия, и я не могу заставить ничего работать.

создания списка и делает пересечение согласно this answer терпит неудачу с известным NumPy не hashable

Если я пытаюсь вычитанием я получаю TypeError неподдерживаемый операнд для ул и ул

Помогите пожалуйста.

+0

Я использовал решение от @chinmay, поскольку это научило меня немного больше о python. Я не пробовал решение от edchum, но, похоже, это сработает. – cryptoref

ответ

1

Вы можете использовать isin() с отрицанием (~) оператора к добиться этого.

>>> stuff_in_df2_but_not_in_df1 = df2[~df2.Unit.isin(df1.Unit)]['Unit'].unique() 
['U3'] 

Это несколько аркан строка кода говорит панд, чтобы дать вам все детали в df2['Unit'], которые не присутствуют в df1['Unit'].

Если вы хотите, чтобы работать в обоих направлениях (то есть, вы хотите получить список вещей, которые находятся в df1, но не в df2и вещи, которая находится в df2, но не в df1, вы могли бы использовать set.symmetric_difference().

Если df1['Unit'] содержит U1, U2, U4 и df2['Unit'] содержит U1, U2, U3, следующий код даст вам set() содержащий {'U3', 'U4'}.

>>> set(df1.Unit.unique()).symmetric_difference(set(df2.Unit.unique())) 
{'U3', 'U4'} 
+0

Это делает трюк. Это просто, хорошо одна строка, и я думаю, что понимаю, как она работает. Я буду знать, что узнал, когда у меня есть что-то близкое, но не точное, и я могу перевести этот фрагмент во что-то другое. Большое спасибо. – cryptoref

0

Надеюсь, что я понимаю ваш вопрос.

Работает ли оно, если вы выберете любое значение df2 ['Unit], которое не равно df [' Unit]?

df2[df.Unit != df2.Unit ] 

выход: enter image description here

+0

Нет, это не сработает. Мой плохой пример: я сделал списки одинакового размера. Реальные данные имеют разные размеры. – cryptoref

0

IIUC, то вы можете создать set уникальных значений, а затем вызвать difference:

In [161]: 
combined = set(df['Unit'].unique().tolist()+df2['Unit'].unique().tolist()) 
combined 

Out[161]: 
{'U1', 'U2', 'U3'} 

In [162]:  
combined.difference(df['Unit'].unique()) 

Out[162]: 
{'U3'} 
Смежные вопросы