मैं दो कॉलम के लिए एक एपीआई परिणाम लागू करने की कोशिश कर रहा हूँ।

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

लेकिन मुझे उम्मीद है कि शायद कोई स्पष्ट समस्या खोज सकता है।

मैं एक एपीआई का उपयोग करके मोबाइल नंबरों को पिंग कर रहा हूं, और कॉलम phone_ping और phone_reason पर जानकारी रिकॉर्ड कर रहा हूं (चाहे वे सक्रिय/निष्क्रिय हैं और अन्य जानकारी)

df = pd.DataFrame(columns=columns, index=range(0, 4))

df['name'] = ['Jim Bob', 'Joe Bloggs', 'Chuck Norris', 'Jane Doe']
df['mobile'] = ['2222588', '+352654600810', pd.np.nan, '+123456']

print(df)

           name         mobile phone_ping phone_reason
0       Jim Bob        2222588        NaN          NaN
1    Joe Bloggs  +352654600810        NaN          NaN
2  Chuck Norris            NaN        NaN          NaN
3      Jane Doe        +123456        NaN          NaN

तो एपीआई फोन नंबर की जांच करता है, और एक संदेश देता है जैसे success साथ में एक अन्य संदेश जैसे deliverable। ये दो कॉलम phone_ping और phone_reason हैं जिन्हें मैं भर रहा हूं।

डीएफ पर आवेदन करने के लिए नीचे दिया गया कार्य:

def pingmobile(phone):

    # if both phone and email are present
    if pd.notnull(phone):

        # Perform GET request
        response = requests.get(url).json()

        # record status and message
        status = response['status']
        message = response['error_text']

        # return it to my two columns
        return pd.DataFrame([(status,message)])

     else:
        # if there is no phone number, just return Nan
        return pd.DataFrame([(pd.np.nan,pd.np.nan)])

फ़ंक्शन को लागू करना, जो डेटा को कॉलम ['phone_ping','phone_reason'] पर वापस करना चाहिए:

df.loc[:,['phone_ping','phone_reason']] = df.loc[:,'mobile'].apply(lambda x: pingmobile(x))

अपेक्षित परिणाम:

           name         mobile phone_ping phone_reason
0       Jim Bob        2222588        Fail         Invalid Number
1    Joe Bloggs  +352654600810        Success      Deliverable
2  Chuck Norris            NaN        NaN          NaN
3      Jane Doe        +123456        Fail         Invalid Number

त्रुटि कोड:

ValueError                                Traceback (most recent call last)
<ipython-input-318-7e506c1da8e2> in <module>
----> 1 df.loc[:,['phone_ping','phone_reason']] = df.loc[:,'mobile'].apply(lambda x: pingmobile(x))

~\Anaconda3\lib\site-packages\pandas\core\indexing.py in __setitem__(self, key, value)
    200             key = com.apply_if_callable(key, self.obj)
    201         indexer = self._get_setitem_indexer(key)
--> 202         self._setitem_with_indexer(indexer, value)
    203 
    204     def _validate_key(self, key, axis: int):

~\Anaconda3\lib\site-packages\pandas\core\indexing.py in _setitem_with_indexer(self, indexer, value)
    577             # actually do the set
    578             self.obj._consolidate_inplace()
--> 579             self.obj._data = self.obj._data.setitem(indexer=indexer, value=value)
    580             self.obj._maybe_update_cacher(clear=True)
    581 

~\Anaconda3\lib\site-packages\pandas\core\internals\managers.py in setitem(self, **kwargs)
    558 
    559     def setitem(self, **kwargs):
--> 560         return self.apply("setitem", **kwargs)
    561 
    562     def putmask(self, **kwargs):

~\Anaconda3\lib\site-packages\pandas\core\internals\managers.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs)
    436                     kwargs[k] = obj.reindex(b_items, axis=axis, copy=align_copy)
    437 
--> 438             applied = getattr(b, f)(**kwargs)
    439             result_blocks = _extend_blocks(applied, result_blocks)
    440 

~\Anaconda3\lib\site-packages\pandas\core\internals\blocks.py in setitem(self, indexer, value)
    936         # set
    937         else:
--> 938             values[indexer] = value
    939 
    940         # coerce and try to infer the dtypes of the result

ValueError: shape mismatch: value array of shape (4,) could not be broadcast to indexing result of shape (2,4)
1
SCool 31 जुलाई 2019, 19:10

1 उत्तर

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

DataFrame के बजाय Series वापस करने का प्रयास करें:

def pingmobile(phone):
    if pd.notnull(phone):
        response = requests.get(url).json()
        status = response['status']
        message = response['error_text']

        return pd.Series({"status": response["status"],
                          "message": response["error_text"]})

    return pd.Series({"status": pd.np.nan,
                      "message": pd.np.nan})

फिर, बस अपना कार्य लागू करें:

df[["phone_ping", "phone_reason"]] = df.mobile.apply(pingmobile)
2
Sidney Neffe 31 जुलाई 2019, 19:28