df1

A B
a 1
a 1
a 4
b 1 
b 3

df2

A B
a 1
a 2
c 3 
c 5

df1.groupby("A").size()

a 3
b 2

df2.groupby("A").size()

a 2
c 2

मैं निम्नलिखित sizeएकत्रीकरण प्राप्त करना चाहता/चाहती हूं

   df1 df2
a  3    2
b  2    0 
c  0    2  

क्या इसे हासिल करने का कोई तरीका है? मैं एकत्रीकरण विधि जानना चाहता हूं।

अगर किसी की राय है तो कृपया मुझे बताएं। धन्यवाद

2
Heisenberg 28 सितंबर 2020, 07:10

6 जवाब

सबसे बढ़िया उत्तर
  1. आप दो समूहीकृत डेटाफ़्रेम पर pd.concat का उपयोग कर सकते हैं और axis=1 पास कर सकते हैं (यह अनिवार्य रूप से outer pd.merge के साथ जुड़ता है, लेकिन सिंटैक्स थोड़ा अधिक संक्षिप्त है)।
  2. फिर, बस .fillna(0) के साथ कुछ सफाई करें, .rename() के साथ वांछित कॉलम का नाम बदलें और कॉलम डेटा प्रकार पूर्णांक बनाने के लिए .astype(int) का उपयोग करें:

df3 = (pd.concat([df1.groupby("A").size(), df2.groupby("A").size()], axis=1)
      .fillna(0).rename({0 : 'df1', 1 : 'df2'}, axis=1).astype(int))
df3
Out[1]: 
   df1  df2
a    3    2
b    2    0
c    0    2
3
David Erickson 28 सितंबर 2020, 07:37

@ डेविड के उत्तर का एक प्रकार:

frames = {"df1": df1, "df2": df2}

pd.concat(
    {key: value.groupby("A").size() for key, value in frames.items()}, axis=1
).fillna(0)
0
sammywemmy 28 सितंबर 2020, 08:03
 #groupby using agg to rename axis.
   g=df1.groupby("A", as_index=False)['B'].agg({'df1':'size'})
    h=df2.groupby("A", as_index=False)['B'].agg({'df2':'size'})

#concat the resultant datframe, fffiil, bfill and dro duplicates

(pd.concat([g,h], ignore_index=True).sort_values(by='A').ffill().bfill()).drop_duplicates()



  A  df1  df2
0  a  3.0  2.0
1  b  2.0  2.0
3  c  2.0  2.0
0
wwnde 28 सितंबर 2020, 07:30

आप नीचे कर सकते हैं:

In [883]: df1 = df1.groupby("A").size().reset_index()

In [884]: df2 = df2.groupby("A").size().reset_index()

In [886]: df1.merge(df2, on='A', how='outer').fillna(0).rename(columns={'0_x': 'df1', '0_y':'df2'}).set_index('A')
Out[886]: 
   df1  df2
A          
a  3.0  2.0
b  2.0  0.0
c  0.0  2.0
0
Mayank Porwal 28 सितंबर 2020, 07:23

concat में संभव है नए कॉलम नामों के लिए पैरामीटर keys का उपयोग करें, क्योंकि Series के साथ काम करना, फिर लापता मानों को बदलना और पूर्णांकों में बदलना:

df3 = (pd.concat([df1.groupby("A").size(), 
                  df2.groupby("A").size()], axis=1, keys=['df1','df2'])
         .fillna(0)
         .astype(int))
print (df3)
   df1  df2
a    3    2
b    2    0
c    0    2

एक अन्य विचार यह है कि पहले concat का उपयोग करें, MultiIndex को DataFrame.reset_index, इसलिए जितना संभव हो DataFrame.pivot_table, आखिरी बार DataFrame.rename_axis:

df3 = (pd.concat([df1, df2], keys=['df1','df2'])
         .reset_index()
         .pivot_table(index='A', columns='level_0', aggfunc='size', fill_value=0)
         .rename_axis(columns=None, index=None)
       )
print (df3)
   df1  df2
a    3    2
b    2    0
c    0    2
1
jezrael 28 सितंबर 2020, 08:18

यदि आप पंडों में काम कर रहे हैं तो मैं एक बाहरी जुड़ाव करूँगा।

data = [['a','a','a','b','b'],[1,1,4,1,3]]
df1 = pd.DataFrame(data).T
df1.columns = ['A','B']

data = [['a','a','c','c'],[1,2,3,5]]
df2 = pd.DataFrame(data).T
df2.columns = ['A','B']

temp1 = pd.DataFrame(df1.groupby("A").size())
temp2 = pd.DataFrame(df2.groupby("A").size())

df = temp1.merge(temp2,how='outer',left_index=True,right_index=True)
df.fillna(0)

उत्पादन

0_x 0_y
A       
a   3.0 2.0
b   2.0 0.0
c   0.0 2.0
1
will.cass.wrig 28 सितंबर 2020, 07:27