2017-06-17 5 views
6

पांडा में कैसे एक से जाने के लिए:नयी आकृति प्रदान पंक्तियों

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
>>> a 
    bar foo 
0 1 m 
1 2 m 
2 3 m 
3 4 s 
4 5 s 
5 6 s 

ख के लिए:

b = pd.DataFrame({'m': [1, 2, 3], 
        's': [4, 5, 6]}) 
>>> b 
    m s 
0 1 4 
1 2 5 
2 3 6 

मैं अन्य उत्तर, उदा समाधान की कोशिश की here और here लेकिन कोई भी ऐसा नहीं कर रहा था जो मैं चाहता हूं।

असल में, मैं कॉलम के साथ पंक्तियों को स्वैप करना चाहता हूं और इंडेक्स ड्रॉप करना चाहता हूं, लेकिन यह कैसे करें?

उत्तर

5
a.set_index(
    [a.groupby('foo').cumcount(), 'foo'] 
).bar.unstack() 
+0

है आप विस्तार कर सकते हैं एक सा क्या हो रहा है? मैंने GroupBy.cumcount() दस्तावेज को देखा, लेकिन यह कुछ हद तक गुप्त है। – PedroA

+1

विस्तार की कमी के लिए मैं क्षमा चाहता हूं। मैं अपने फोन पर हूँ। आपके पास मौजूद जानकारी के साथ समस्या यह है कि आपको एक ही foo मान के साथ अलग-अलग मानों के बीच अंतर करने की आवश्यकता है। Cumcount वास्तव में पहले 3 के लिए 0, 1, और 2 बनाकर और दूसरे तीन के लिए फिर से बनाकर करता है। और भी यह है कि यह काम करेगा यदि वे आकार के दोनों नहीं थे 3. पदों को देखते हुए मैंने इंडेक्स को सेट किया, यह पूरी तरह से एक अनावश्यक के लिए तैयार किया गया है। – piRSquared

+0

@piRSquared धन्यवाद, set_index के बारे में अतिरिक्त जानें – Wen

3

यह मेरा समाधान

a = pd.DataFrame({'foo': ['m', 'm', 'm', 's', 's', 's'], 
        'bar': [1, 2, 3, 4, 5, 6]}) 
a.pivot(columns='foo', values='bar').apply(lambda x: pd.Series(x.dropna().values)) 

foo m s 
0 1.0 4.0 
1 2.0 5.0 
2 3.0 6.0 
संबंधित मुद्दे