поиск несоответствующих записей в пандах - PullRequest
0 голосов
/ 02 мая 2018

Я хотел бы определить, не представлен ли набор записей отдельным списком значений; так что в этом примере:

raw_data = {
        'subject_id': ['1', '2', '3', '4', '5'],
        'first_name': ['Alex', 'Amy', 'Allen', 'Alice', 'Ayoung'], 
        'last_name': ['Anderson', 'Ackerman', 'Ali', 'Aoni', 'Atiches'],
        'sport' : ['soccer','soccer','soccer','soccer','soccer']}
df_a = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name','sport'])

raw_data = {
        'subject_id': ['9', '5', '6', '7', '8'],
        'first_name': ['Billy', 'Brian', 'Bran', 'Bryce', 'Betty'], 
        'last_name': ['Bonder', 'Black', 'Balwner', 'Brice', 'Btisan'],
        'sport' : ['soccer','soccer','soccer','soccer','soccer']}
df_b = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name','sport'])

raw_data = {
        'subject_id': ['9', '5', '6', '7'],
        'first_name': ['Billy', 'Brian', 'Bran', 'Bryce'], 
        'last_name': ['Bonder', 'Black', 'Balwner', 'Brice'],
        'sport' : ['football','football','football','football']}
df_c = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name','sport'])

raw_data = {
        'subject_id': ['1', '3', '5'],
        'first_name': ['Alex', 'Allen', 'Ayoung'], 
        'last_name': ['Anderson', 'Ali',  'Atiches'],
       'sport' : ['football','football','football']}
df_d = pd.DataFrame(raw_data, columns = ['subject_id', 'first_name', 'last_name','sport'])

frames = [df_a,df_b,df_c,df_d]

frame = pd.concat(frames)
frame = frame.sort_values(by='subject_id')

raw_data = {
        'sport':['soccer','football','softball']
        }
sportlist = pd.DataFrame(raw_data,columns=['sport'])

Желаемый результат: я хотел бы получить список пар имя_имя и фамилия, которые не играют в футбол. А также я хотел бы иметь возможность вернуть список всех записей, поскольку софтбол не представлен в исходном списке.

Я попытался использовать слияние с параметрами how = external, pointer = True, но, поскольку есть запись, которая играет в футбол, есть совпадение. И «_right_only» не дает никаких записей, так как он не был заполнен в исходных данных.

Спасибо, AEM

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы также можете использовать .loc индексатор в пандах

frame.loc[frame['sport'].ne('football'), ['first_name','last_name']].values.tolist()

[['Alex', 'Anderson'],
 ['Amy', 'Ackerman'],
 ['Allen', 'Ali'],
 ['Alice', 'Aoni'],
 ['Brian', 'Black'],
 ['Ayoung', 'Atiches'],
 ['Bran', 'Balwner'],
 ['Bryce', 'Brice'],
 ['Betty', 'Btisan'],
 ['Billy', 'Bonder']]
0 голосов
/ 02 мая 2018

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

frame[frame.sport != 'football']

Что бы выбирать только тех людей, которые не играют в футбол.

Если это должен быть список, вы можете позвонить to_records(index=False)

frame[frame.sport != 'football'][['first_name', 'last_name']].to_records(index=False)

, который возвращает список кортежей:

[('Alex', 'Anderson'), ('Amy', 'Ackerman'), ('Allen', 'Ali'),
 ('Alice', 'Aoni'), ('Brian', 'Black'), ('Ayoung', 'Atiches'),
 ('Bran', 'Balwner'), ('Bryce', 'Brice'), ('Betty', 'Btisan'),
 ('Billy', 'Bonder')]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...