在熊猫中找到不匹配的记录

时间:2018-05-02 18:10:14

标签: python-3.x pandas

我想确定一组记录是否没有由不同的值列表表示;所以在这个例子中:

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'])

所需的输出:我想获得一个不玩足球的first_name和last_name对的列表。而且我希望能够返回所有记录的列表,因为垒球没有在原始列表中表示。

我尝试使用merge与how = outer,indicator = True选项合并,但由于有一条足球比赛的记录。并且' _right_only'没有记录,因为它没有填充原始数据。

谢谢, AEM

2 个答案:

答案 0 :(得分:0)

如果您只想获得不踢足球的人的名字,那么您需要做的是:

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')]

答案 1 :(得分:0)

您还可以在pandas中使用.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']]