蟒蛇& pandas - 删除列值是另一个DataFrame中的索引值的行

时间:2016-09-08 13:07:33

标签: python pandas dataframe

原始数据框架(df1)如下所示:

  NoUsager Sens NoAdresse Fait  Weekday NoDemande  Periods
 0 000001   +    000079    1     Dim   42191000972 Soir 
 1 001875   +    005018    1     Dim   42191001052 Matin 
 2 001651   +    005018    1     Dim   42191001051 Matin 
 3 001486   +    000405    1     Dim   42191001250 Matin 
 4 002021   +    005712    1     Dim   42191000013 Matin 
 5 001975   +    005712    1     Dim   42191000012 Matin 
 6 001304   +    001408    1     Dim   42191000371 Matin 
 7 001355   +    005021    1     Dim   42191000622 Matin 
 8 002274   +    006570    1     Dim   42191001053 Matin 
 9 000040   +    004681    1     Dim   42191002507 Soir

我使用crosstab生成一个新的df2 index = NoDemande, NoUsager, Periodscolumns = ['Sens']

                       Sens  + - 
NoDemande  NoUsager Periods
42191000622 001355  Matin    1 2 
42191000959 001877  Matin    1 2 
42191001325 000627  Soir     1 2 
42191001412 000363  Matin    1 2 
42191001424 000443  Soir     1 2 
42191001426 001308  Soir     1 2 
42191002507 000040  Soir     2 0 
42193000171 000257  Soir     1 2 
42193000172 002398  Soir     1 2 

我想删除df1中的所有行,其中列NoUsagerNoDemande中的值与索引NoUsagerNoDemande中的值相同在df2。因此,结果将返回具有相同df3格式但没有df1line7的新DataFrame line9

我试过了:

df3 = df1.loc[~df1['NoDemande','NoUsager'].isin([df2.NoDemande,df2.NoUsager])]

但它返回了:KeyError: ('NoDemande', 'NoUsager')

我该如何解决这个问题?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

cols = ['NoDemande','NoUsager']
mask = df1[cols].isin(df2.reset_index()[cols].to_dict('list'))
df1[~mask.all(1)]

enter image description here

你做错了三件事。

  1. df1['NoDemande','NoUsager']需要df1[['NoDemande','NoUsager']]

  2. df2的索引级别名称为['NoDemande','NoUsager']。您必须重置索引才能将它们重新转换为列。

  3. 为此目的使用isin时,请将df2.reset_index()[['NoDemande','NoUsager']]转换为字典。