熊猫-检查数据框的子集是否在另一个数据框中

时间:2018-11-12 17:43:20

标签: python pandas dataframe

我有以下数据框,我将其称为“名称”:

date       name    code  
6/1/2018   A       5     
6/1/2018   B       5     
7/1/2018   A       5     
7/1/2018   B       5     

我需要更改以下df:

date       name    comment   
5/1/2018   A       'Good'    
6/1/2018   A       'Good'    
6/1/2018   B       'Good'    
6/1/2018   C       'Good'    
7/1/2018   A       'Good'    
7/1/2018   B       'Good'    

如果名称不在该日期的名称数据框中

,我需要将注释更改为“不良”

现在我有:

df['comment'] = np.where(~df['name'].isin(names['name']), 'Bad', df['comment'])

尽管显然这行不通,因为它没有考虑名称和日期。

最终输出:

date       name    comment   
5/1/2018   A       'Bad'     
6/1/2018   A       'Good'    
6/1/2018   B       'Good'    
6/1/2018   C       'Bad'     
7/1/2018   A       'Good'    
7/1/2018   B       'Good'    

第一行已更改,因为名称数据框中没有5/1的A条目。之所以更改C行,是因为名称df中没有6/1的C条目(或者根本没有C条目)。

注意:两个数据帧(名称和df)都比我所显示的大,行和列都大。

2 个答案:

答案 0 :(得分:2)

使用pd.Index.get_indexer的性能解决方案:

v = names.set_index(['date', 'name'])
m = v.index.get_indexer(pd.MultiIndex.from_arrays([df.date, df.name])) == -1
df.loc[m, 'comment'] = '\'Bad\''

print(df)
      date name comment
0  5/1/2018    A   'Bad'
1  6/1/2018    A  'Good'
2  6/1/2018    B  'Good'
3  6/1/2018    C   'Bad'
4  7/1/2018    A  'Good'
5  7/1/2018    B  'Good'

或者,执行一次LEFT OUTER merge,确定右侧DataFrame中的缺失值,然后将其用于mask行:

m = df.merge(names, how='left', on=['date', 'name']).code.isna()
df['comment'] = df['comment'].mask(m, '\'Bad\'')

print(df)
       date name comment
0  5/1/2018    A   'Bad'
1  6/1/2018    A  'Good'
2  6/1/2018    B  'Good'
3  6/1/2018    C   'Bad'
4  7/1/2018    A  'Good'
5  7/1/2018    B  'Good'

答案 1 :(得分:1)

您可以使用pd.Index.isin,然后使用pd.Series.where

idx_cols = ['date', 'name']
mask = df.set_index(idx_cols).index.isin(names.set_index(idx_cols).index)

df['comment'].where(mask, '\'Bad\'', inplace=True)

print(df)

       date name comment
0  5/1/2018    A   'Bad'
1  6/1/2018    A  'Good'
2  6/1/2018    B  'Good'
3  6/1/2018    C   'Bad'
4  7/1/2018    A  'Good'
5  7/1/2018    B  'Good'