如果在Pandas Datraframe中找到字典,如何返回True / False

时间:2019-04-24 13:40:21

标签: python pandas

这很简单,我似乎找不到一个简单的答案(看来这应该很简单)。

python是否具有内置函数,该函数将检查是否在数据框中找到字典,返回true或false。

样本数据框

>>> df  = pd.DataFrame({'ID':[546,107,478,546,478], 'ID2':['AUSER','BUSER','CUSER','AUSER','EUSER'], 'DO':[3,6,8,4,6], 'DATA':['ORIG','ORIG','ORIG','ORIG','ORIG']})
>>> df
   DATA  DO   ID    ID2
0  ORIG   3  546  AUSER
1  ORIG   6  107  BUSER
2  ORIG   8  478  CUSER
3  ORIG   4  546  AUSER
4  ORIG   6  478  EUSER

>>> true_sample  = {'DO': 3, 'ID2': 'AUSER'}
>>> false_sample = {'DO': 6, 'ID2': 'AUSER'}

我一直在尝试使df.isin()工作,但是我似乎不希望dict值成为列表。谁能提供简单的支票?

编辑: 我已经看到了一些很棒的主意,但是要明确地说,他们的愿望是使用逻辑从if子句中求值。这是一个扔掉的例子,(我实际上没有定义一个函数,我只是使用f()表示将要使用的逻辑);

>>> if f(true_sample):
>>>    print("yeah it's there")
>>> if not f(false_sample):
>>>    print("Doesn't exist in the dataframe")

4 个答案:

答案 0 :(得分:2)

IIUC,您可以结合列表理解使用numpy.logical_andnumpy.ndarray.any

import numpy as np

mask = np.logical_and(*[df[k].eq(v) for k, v in true_sample.items()])
mask.any()

[出]

True

如果需要,您还可以使用此掩码为您的DataFrame编制索引:

df[mask]

[出]

    ID    ID2  DO  DATA
0  546  AUSER   3  ORIG

用作def的示例:

def contains_dict(df, d):
    mask = np.logical_and(*[df[k].eq(v) for k, v in d.items()])
    if mask.any():
        print("yeah it's there")
    else:
        print("Doesn't exist in the dataframe")

contains_dict(df, true_sample)

[出]

yeah it's there

答案 1 :(得分:2)

您可以将true_sample和false_samples转换为数据帧,并使用merge这样从df中仅获取True或False样本:

df_true = pd.DataFrame.from_dict(true_sample, orient='index').T.merge(df, on=['DO','ID2'])

输出:

  DO    ID2   ID  DATA
0  3  AUSER  546  ORIG

答案 2 :(得分:1)

首先update您的dict,然后我们创建另一个DataFramemerge

true_sample.update({'Key':'True'});false_sample.update({'Key':'Fasle'})
yourdf=df.merge(pd.DataFrame([true_sample,false_sample]),how='left')
# notice here I would like keep the key instead drop the row.
Out[199]: 
    ID    ID2  DO  DATA   Key
0  546  AUSER   3  ORIG  True
1  107  BUSER   6  ORIG   NaN
2  478  CUSER   8  ORIG   NaN
3  546  AUSER   4  ORIG   NaN
4  478  EUSER   6  ORIG   NaN

答案 3 :(得分:0)

如果要查看数据帧中是否包含true_sample,可以使用.any()方法。

>>> ((df['DO'] == 3) & (df['ID2'] == AUSER)).any()
True
>>> ((df['DO'] == 6) & (df['ID2'] == AUSER)).any()
False