मेरे पास निम्न डेटाफ़्रेम है:

df = pd.DataFrame([{'name': 'John', 'counter' : [1,1,3,5]},{'name': 'John', 'counter' : [2,0,1,5]},{'name': 'John', 'counter' : [4,1,2,2]}])
df['counter'] = df['counter'].apply(lambda x : np.array(x))
df['counter2'] = df['counter']
df['pmcount'] = 1

df
   name       counter      counter2  pmcount
0  John  [1, 1, 3, 5]  [1, 1, 3, 5]        1
1  John  [2, 0, 1, 5]  [2, 0, 1, 5]        1
2  John  [4, 1, 2, 2]  [4, 1, 2, 2]        1

और मुझे क्रमशः प्रत्येक कॉलम में "np.sum", "np.maximum.reduce" और "sum" फ़ंक्शंस को लागू करने वाले 'नाम' द्वारा डेटा को समूहित करने की आवश्यकता है।


अलग-अलग, प्रत्येक कार्य ठीक काम करता है:

result1 = df.groupby(['name'])['counter'].apply(np.sum).reset_index()
result1
   name        counter
0  John  [7, 2, 6, 12]

result2 = df.groupby(['name'])['counter2'].apply(lambda x: np.maximum.reduce(list(x))).reset_index()
result2
   name      counter2
0  John  [4, 1, 3, 5]

result3 = df.groupby(['name'])['pmcount'].sum().reset_index()
result3
   name  pmcount
0  John        3

लेकिन जब मैं प्रत्येक कॉलम में प्रत्येक फ़ंक्शन को निर्दिष्ट करने के लिए पांडा एग्रीगेट फ़ंक्शन का उपयोग करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है:

function_dict = {'counter': np.sum , "counter2": lambda x: np.maximum.reduce(list(x)) , 'pmcount': 'sum'}
result = df.groupby('name').agg(function_dict)

ValueError: Must produce aggregated value

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

   name        counter      counter2  pmcount
0  John  [7, 2, 6, 12]  [4, 1, 3, 5]        3

मैंने सरणी कॉलम में np.array के बजाय सूची प्रकार का उपयोग करने की कोशिश की, लेकिन न केवल मुझे वही त्रुटि मिली, लेकिन साथ ही मैं np.sum फ़ंक्शन (यहां तक ​​कि लैम्ब्डा एक्सप्रेशन के साथ np.array() का उपयोग करके) के समान परिणाम को पुन: पेश नहीं कर सका।

4
Jeferson Correa 20 जिंदा 2021, 21:08

3 जवाब

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

आपको परिणामों को सूचियों में बदलना होगा, अन्यथा, परिणाम को एक श्रृंखला o DataFrame . के रूप में व्याख्यायित किया जाएगा

function_dict = {'counter': lambda x: list(np.sum(x)) , "counter2": lambda x: list(np.maximum.reduce(list(x))) , 'pmcount': 'sum'}
2
jjsantoso 20 जिंदा 2021, 21:32

एकत्र करने की कोई आवश्यकता नहीं है, जैसा कि आपने पहले ही काम कर लिया है:

  1. "ग्रुप बाय" ऑपरेशन को फैक्टर-आउट करें
  2. अनुक्रमित रीसेट न करें (मध्यवर्ती चरण पर)
  3. एक नया डेटाफ़्रेम बनाएं जिसमें समान अनुक्रमणिका होगी
ndf = pd.DataFrame()
ndf['counter'] = gdf['counter'].apply(np.sum)
ndf['counter2'] = gdf['counter2'].apply(lambda x: np.maximum.reduce(list(x)))
ndf['pmcount'] = gdf['pmcount'].sum()
ndf.reset_index(inplace=True)

Out[1]: 
   name        counter      counter2  pmcount
0  John  [7, 2, 6, 12]  [4, 1, 3, 5]        3
3
apaolillo 20 जिंदा 2021, 21:22

प्रयत्न:

df = df.groupby(['name']).agg({'counter': lambda x: list(x.sum()), 'counter2': lambda x: ((list(x))), 'pmcount': 'sum'}) .reset_index()
df['counter2'] = df['counter2'].apply(lambda x: np.maximum.reduce(np.array(x)))

या

df.groupby(['name']).agg({'counter': lambda x: list(x.sum()), 'counter2': lambda x: list(np.maximum.reduce(list(x))), 'pmcount': 'sum'}).reset_index()

डीएफ:

    name    counter         counter2        pmcount
0   John    [7, 2, 6, 12]   [4, 1, 3, 5]    3
1
Pygirl 20 जिंदा 2021, 21:39