Удалить общую часть данных в условиях. панд - PullRequest
0 голосов
/ 14 октября 2019

У меня есть два кадра данных: мужской и женский

male = pd.DataFrame(np.array([[777, 'male', 9]
                                ,[999, 'male', 9],[999, 'male', 9]])
                   ,columns=['a', 'b', 'c'])

female=pd.DataFrame(np.array([[119, 'female', 9],[777, 'female', 9]
                                ,[777, 'female', 9],[999, 'female', 9]])
                   ,columns=['a', 'b', 'c'])


male:
     a     b  c
0  777  male  9
1  999  male  9
2  999  male  9

female:
     a       b  c
0  119  female  9
1  777  female  9
2  777  female  9
3  999  female  9

Мне нужно удалить общую часть из них обоих, но с одинаковым количеством строк с учетом только столбцов a and c, например, еслиОДНА строка имеет то же значение (a и c), что и во втором кадре данных, удалите обе (2 строки, даже если совпадают несколько строк)

Я пытался использовать

df=pd.concat([male,female]).drop_duplicates(subset=['a','c'])
print(df)
     a       b  c
0  777    male  9
1  999    male  9
0  119  female  9

my expected output is:
     a       b  c
2  999    male  9
0  119  female  9
2  777  female  9

в качестве результата iнеобходимо удалить строки, которые существуют во втором кадре данных только один раз, drop_duplicates () берет все, что существует более одного раза. Я забочусь только об отбрасывании дубликатов между фреймами данных

Ответы [ 2 ]

2 голосов
/ 14 октября 2019

Посмотрите, работает ли это для вас.

df=pd.concat([male,female])
df['g'] = df.groupby(['a','b','c'])['b'].cumcount()
df1=df.drop_duplicates(subset=['a','c','g']).drop_duplicates(subset=['a','c'],keep='last').drop('g', axis=1)
print(df1)

Вывод

      a        b    c
2   999     male    9
0   119     female  9
2   777     female  9
0 голосов
/ 14 октября 2019

, если вы хотите удалить отдельно строки в обоих фреймах данных, вот мой немного другой подход:

male['n'] = male.groupby(['a','b','c']).cumcount()
female['n'] = female.groupby(['a','b','c']).cumcount()

male = male.set_index(['a','c','n'])
female = female.set_index(['a','c','n'])

row_del = set(list(male.index)).intersection(set(list(female.index)))  # evaluate estimate pairs {("a","c",order_number)}

#
# row_del gives you intersection of indexes like this: {('999', '9', 0), ('777', '9', 0)}
#

male.drop(row_del)
female.drop(row_del)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...