मैं यह देखने की कोशिश कर रहा हूं कि क्या मैं डेटाफ्रेम में एक श्रृंखला बना सकता हूं जो किसी सेल के लिए एक मान देता है, इस पर निर्भर करता है कि किसी अन्य श्रृंखला में सेल में दी गई स्ट्रिंग है या नहीं। मुझे समझाने दो:
मेरे पास कॉलम "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"}
वास्तव में यह सुनिश्चित नहीं है कि यह कैसे करें ..
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
हम्म सुनिश्चित करें कि शब्दकोश में सभी तत्व स्ट्रिंग हैं जैसे
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
आप 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]
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।