मैं यह देखने की कोशिश कर रहा हूं कि क्या मैं डेटाफ्रेम में एक श्रृंखला बना सकता हूं जो किसी सेल के लिए एक मान देता है, इस पर निर्भर करता है कि किसी अन्य श्रृंखला में सेल में दी गई स्ट्रिंग है या नहीं। मुझे समझाने दो:

मेरे पास कॉलम "restaurant_name" और "brand_name" के साथ एक डेटाफ़्रेम है

data = [["mcdonalds central london", ""], ["pizza hut downtown new york" ,""], 
        ["dominos new jersey",""], ["mac donald berlin", ""]]

restaurants = pd.DataFrame(data, columns=['restaurant_name', 'brand_name'])

मेरे पास स्ट्रिंग्स के साथ कुंजी और स्वरूपित ब्रांड नाम मानों के रूप में एक शब्दकोश है। मैं एल्गोरिदम को जांचना चाहता हूं कि रेस्तरां ["रेस्तरां_नाम"] में ब्रांड_डिक्शनरी से एक कुंजी है और यदि मैं चाहता हूं कि यह डेटा में उस कुंजी के अनुरूप मान वापस कर दे ["ब्रांड_नाम"]

brand_dictionary = {
"mcdonalds" : "McDonald's",
"mac donald" : "McDonald's",
"dominos" : "Dominos Pizza",
"pizza hut" : "Pizza Hut"}

वास्तव में यह सुनिश्चित नहीं है कि यह कैसे करें ..

1
aramis 29 अक्टूबर 2020, 20:26

3 जवाब

सबसे बढ़िया उत्तर

शब्दकोश खोजने के लिए आप .apply() में कस्टम फ़ंक्शन का उपयोग कर सकते हैं (यदि कोई ब्रांड नहीं मिलता है - लौटाया जाता है):

import pandas as pd


data = [["mcdonalds central london", ""], ["pizza hut downtown new york" ,""], ["dominos new jersey",""], [ "mac donald berlin", ""] ]

restaurants = pd.DataFrame(data, columns = ['restaurant_name', 'brand_name'])
    
brand_dictionary = {
"mcdonalds" : "McDonald's",
"mac donald" : "McDonald's",
"dominos" : "Dominos Pizza",
"pizza hut" : "Pizza Hut"}

def get_name(restaurant, dct):
    for r in dct:
        if r in restaurant:
            return dct[r]
    return '-'

restaurants['brand_name'] = restaurants['restaurant_name'].apply(lambda x: get_name(x, brand_dictionary))
print(restaurants)

प्रिंट:

               restaurant_name     brand_name
0     mcdonalds central london     McDonald's
1  pizza hut downtown new york      Pizza Hut
2           dominos new jersey  Dominos Pizza
3            mac donald berlin     McDonald's
5
Andrej Kesely 29 अक्टूबर 2020, 20:32

हम्म सुनिश्चित करें कि शब्दकोश में सभी तत्व स्ट्रिंग हैं जैसे

 brand_dictionary = {
   "mcdonalds" : "McDonald's",
   "mac donald" : "McDonald's",
   "dominos" : "Dominos Pizza",
   "pizza hut" : "Pizza Hut"}

फिर, हम इस तरह लूप कर सकते हैं:

brand_names = []
for i in range(0, restaurants.shape[0]):
    # read the name in the column 
    current_key =  restaurants['restaurant_name'].iloc[i]
    try:
        # Now if that name exists in dictionary, check its value and add that to list
        brand_names.append(brand_dictionary[current_key])
    except:
        #If that key dosent exist in dict, then just add nan, or 'NA'
        brand_names.append(np.nan) # or.append('NA')

#Add the final list to main dataframe.
restaurants['BrandNames'] = brand_names
0
BigBen 29 अक्टूबर 2020, 21:24

आप str.extract पहले शब्द का मिलान कर सकते हैं और फिर शब्दकोश के साथ मिलान को मैप कर सकते हैं।

pat = f'({"|".join(brand_dictionary.keys())})'
#'(mcdonalds|mac donald|dominos|pizza hut)'

df['brand_name'] = df['restaurant_name'].str.extract(pat)[0].map(brand_dictionary)

               restaurant_name     brand_name
0     mcdonalds central london     McDonald's
1  pizza hut downtown new york      Pizza Hut
2           dominos new jersey  Dominos Pizza
3            mac donald berlin     McDonald's

यदि आप एक ही पंक्ति में कई मैचों की संभावना से निपटना चाहते हैं तो आप str.extractall पर स्विच कर सकते हैं और फिर मेल खाने वाले सभी ब्रांड्स को स्टोर करने के लिए सूची की तरह कुछ एकत्रीकरण का उपयोग कर सकते हैं।

df['brand_name'] = (df['restaurant_name'].str.extractall(pat)[0].map(brand_dictionary)
                      .groupby(level=0).agg(list))

               restaurant_name       brand_name
0     mcdonalds central london     [McDonald's]
1  pizza hut downtown new york      [Pizza Hut]
2           dominos new jersey  [Dominos Pizza]
3            mac donald berlin     [McDonald's]
1
ALollz 29 अक्टूबर 2020, 20:54