संक्षिप्त प्रश्न:

मैं एक बहु-अनुक्रमित पांडा डेटाफ़्रेम को दो अलग-अलग तरीकों से समूहीकृत करने के बाद एक स्तंभ (डेटा श्रृंखला) का माध्य प्राप्त करने का प्रयास कर रहा हूं। अंतर केवल डेटाफ़्रेम के निर्माण का है। एक मुझे वांछित परिणाम देता है, दूसरा त्रुटि देता है DataError: No numeric types to aggregate

विवरण:

निर्माण के लिए सामान्य डेटा

import pandas as pd
import numpy as np
indexTuples = [('a', 1), ('b', 3), ('a', 2), ('c', 2), ('c', 3), ('b', 8)]
multiIndex = pd.MultiIndex.from_tuples(indexTuples, names = ['x', 'y'])

विधि 1 द्वारा DataFrame का निर्माण

columns = ['alpha', 'beta', 'gamma']
df = pd.DataFrame(index=multiIndex, columns=columns)

alpha = pd.Series(index=multiIndex)
beta = pd.Series(index=multiIndex)
gamma = pd.Series(index=multiIndex)

for tup in indexTuples:
    alpha[tup[0], tup[1]] = np.random.randint(400)
    beta[tup[0], tup[1]] = np.random.randint(400)
    gamma[tup[0], tup[1]] = np.random.randint(400)

df.alpha = alpha
df.beta = beta
df.gamma = gamma

df.alpha['a'] = np.nan

df

डेटाफ्रेम देता है जो निम्न जैसा दिखता है

     alpha   beta  gamma
x y                     
a 1    NaN  136.0  224.0
b 3  375.0  227.0  191.0
a 2    NaN  367.0  195.0
c 2  247.0   61.0   78.0
  3  238.0  187.0  366.0
b 8  302.0   14.0  272.0    

और अगर मैं निम्नलिखित ऑपरेशन करता हूं, तो मुझे अपेक्षित परिणाम मिलता है

df.groupby(level='x').alpha.mean()

परिणाम

x
a      NaN
b    148.0
c    244.5
Name: alpha, dtype: float64

विधि 2 द्वारा डेटाफ़्रेम का निर्माण करना

columns = ['alpha', 'beta', 'gamma']
_df = pd.DataFrame(index=multiIndex, columns=columns)

for tup in indexTuples:
    _df.alpha[tup[0], tup[1]] = np.random.randint(400)
    _df.beta[tup[0], tup[1]] = np.random.randint(400)
    _df.gamma[tup[0], tup[1]] = np.random.randint(400)

_df.alpha['a'] = np.nan

NaN मानों के साथ एक समान दिखने वाला डेटाफ़्रेम देता है जैसा कि पिछली विधि में दिखाया गया है

लेकिन अब जब मैं स्तर के आधार पर समूह बनाने के बाद माध्य खोजने का प्रयास करता हूँ

_df.groupby(level='x').alpha.mean() 

मुझे निम्नलिखित त्रुटि मिलती है

---------------------------------------------------------------------------
DataError                                 Traceback (most recent call last)
<ipython-input-192-ad2de6450fab> in <module>()
----> 1 _df.groupby(level='x').alpha.mean()

/film/tools/packages/pandas/0.18.0/CentOS-6.2_thru_7/python-2.7/lib/python2.7/site-packages/pandas-0.18.0-py2.7-linux-x86_64.egg/pandas/core/groupby.pyc in mean(self)
    933         """
    934         try:
--> 935             return self._cython_agg_general('mean')
    936         except GroupByError:
    937             raise

/film/tools/packages/pandas/0.18.0/CentOS-6.2_thru_7/python-2.7/lib/python2.7/site-packages/pandas-0.18.0-py2.7-linux-x86_64.egg/pandas/core/groupby.pyc in _cython_agg_general(self, how, numeric_only)
    750 
    751         if len(output) == 0:
--> 752             raise DataError('No numeric types to aggregate')
    753 
    754         return self._wrap_aggregated_output(output, names)

DataError: No numeric types to aggregate

यह पहले मामले में क्यों काम कर रहा है और दूसरे मामले में क्यों नहीं?

2
narenandu 10 जून 2016, 09:10

1 उत्तर

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

जब आपने _df का निर्माण किया, तो यह dtype object बन गया। ऐसा इसलिए होता है क्योंकि जैसा कि आपने _df को परिभाषित किया था, आपने इसे किसी भी डेटा के साथ आरंभ नहीं किया और डिफ़ॉल्ट रूप से object कर दिया। निर्माण #1 में, आपने मूल्यों के साथ स्वतंत्र रूप से निर्मित series निर्दिष्ट करके और इसके परिणामस्वरूप फ्लोट प्रकार निर्दिष्ट करके इस पर काबू पाया। निर्माण #2 में, आपने स्पष्ट रूप से डेटा के साथ _df स्थानों को निर्दिष्ट किया है। वे स्थान पहले से ही object माने गए थे।

_df.dtypes

alpha    object
beta     object
gamma    object
dtype: object

अपना परिणाम प्राप्त करने के लिए इसका उपयोग करें:

_df.astype(float).groupby(level='x').alpha.mean()
2
piRSquared 10 जून 2016, 09:36
किसी तरह dtype मेरे डेटाफ़्रेम पर काम नहीं करता है, लेकिन आप समाधान काम करते हैं! डीटाइप इश्यू _df.dtype AttributeError: 'DataFrame' object has no attribute 'dtype' के रूप में सही बताया गया है
 – 
narenandu
10 जून 2016, 09:35
वह मेरा टाइपो है। यह dtypes होना चाहिए (डेटाफ़्रेम के लिए बहुवचन)
 – 
piRSquared
10 जून 2016, 09:36