डेटाफ़्रेम को देखते हुए, डेटाफ़्रेम में पंक्तियों को खोजने का सबसे अच्छा तरीका क्या है जो आंशिक रूप से दिए गए मानों की सूची से मेल खाता है।

वर्तमान में मेरे पास डेटाफ्रेम (डीएफ 1) में दिए गए मानों की पंक्तियां हैं, मैं उन लोगों के माध्यम से पुनरावृत्त करता हूं, फिर किसी अन्य डेटाफ्रेम (डीएफ 2) की प्रत्येक पंक्ति में एक फ़ंक्शन लागू करता हूं जो गणना करता है कि पंक्ति में कितने मान शर्तों से मेल खाते हैं, फिर एक सबसेट वापस करें दूसरा डेटाफ्रेम जहां गिनती एक निश्चित मूल्य से ऊपर है।

def partialMatch(row, conditions):
    count = 0
    if(row['ResidenceZip'] == conditions['ResidenceZip']):
        count+=1
    if(row['FirstName'] == conditions['FirstName']):
        count +=1
    if(row['LastName'] == conditions['LastName']):
        count +=1
    if(row['Birthday'] == conditions['Birthday']):
        count+=1
    return count

concat_all = []
for i, row in df1.iterrows():
    c = {'ResidenceZip': row['ResidenceZip'], 'FirstName':row['FirstName'], 
         'LastName': row['LastName'],'Birthday': row['Birthday']}
    df2['count'] = df2.apply(lambda x: partialMatch(x, c), axis = 1)
    x1 = df2[df2['count']>=3]
    concat_all.append(x1)

यह काम करता है, लेकिन बहुत धीमा है। इस प्रक्रिया को तेज करने के लिए कोई सुझाव?

उदाहरण के लिए, नीचे दिए गए दो डेटाफ़्रेम पर कोड चलाकर, df1 की पहली पंक्ति df2 की पहली तीन पंक्तियाँ लौटाएगी, लेकिन अंतिम दो नहीं।

df1
    FirstName|LastName | Birthday | ResidenceZip 
    John     |  Doe    | 1/1/2000 |  99999
    Rob      |  A      | 1/1/2010 |  19499

df2
    FirstName|LastName | Birthday | ResidenceZip | count
    John     |  Doe    | 1/1/2000 |  99999       | 3
    John     |  Doe    | 1/1/2000 |  99999       | 3
    John     |  Doex   | 1/1/2000 |  99999       | 3
    Joha     |  Doex   | 1/1/2000 |  99999       | 2
    Joha     |  Doex   | 9/9/2000 |  99999       | 1
    Rob      |  A      | 9/9/2009 |  19499       | 0
0
SharpObject 18 अक्टूबर 2018, 00:12

1 उत्तर

Numpy isin फ़ंक्शन का उपयोग करना:

df1_vals = df1.values
df2_vals = df2.values
df1_rows = range(df1_vals.shape[0])

concat_all = \
    [df2[np.add.reduce(np.isin(df2_vals, df1_vals[row]), axis=1) >= 3] for row in df1_rows]

यहाँ सेटअप के लिए डेटाफ़्रेम हैं:

df1 = pd.DataFrame({'FirstName': ['John', 'Rob'],
                    'LastName': ['Doe', 'A'],
                    'Birthday': ['1/1/2000', '9/9/2009'],
                    'ResidenceZip': [99999, 19499]})

df2 = pd.DataFrame({'FirstName': ['John', 'John', 'John', 'Joha', 'Joha', 'Rob'],
                    'LastName': ['Doe', 'Doe', 'Doex', 'Doex', 'Doex', 'A'],
                    'Birthday': ['1/1/2000', '1/1/2000', '1/1/2000', '1/1/2000', '9/9/2000', '9/9/2009'],
                    'ResidenceZip': [99999, 99999, 99999, 99999, 99999, 19499]})
1
b2002 18 अक्टूबर 2018, 00:35