这很简单,我似乎找不到一个简单的答案(看来这应该很简单)。
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")
答案 0 :(得分:2)
IIUC,您可以结合列表理解使用numpy.logical_and
和numpy.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
,然后我们创建另一个DataFrame
,merge
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