2014-10-09 9 views
11

मेरे पास एक पांडस डेटाफ्रेम है, और मैं एक नया कॉलम बनाना चाहता हूं जिसका मूल्य किसी अन्य कॉलम का है, जो एक पंक्ति से नीचे चला गया है। अंतिम पंक्ति NaN दिखाना चाहिए।पांडा: समूह के भीतर एक पंक्ति से मूल्यों को नीचे रखें

पकड़ यह है कि मैं समूह द्वारा ऐसा करना चाहता हूं, प्रत्येक समूह की अंतिम पंक्ति NaN दिखाती है। किसी समूह की अंतिम पंक्ति "चोरी" को उस समूह से मूल्य नहीं है जो डेटाफ्रेम में आसन्न होता है।

मेरा प्रयास कार्यान्वयन काफी शर्मनाक रूप से टूटा हुआ है, इसलिए मैं स्पष्ट रूप से कुछ मौलिक समझ रहा हूं।

df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.values[1:]) 
+3

क्या यह काम करता है: 'df ['B_shifted'] = df.groupby (['ए']) ['बी']। ट्रांसफॉर्म (लैम्ब्डा x: x.shift()) '? – EdChum

+3

जब भी कुछ मुश्किल हो तो मैं पांडस में करना चाहता हूं, पहले से ही एक समारोह लिखा गया है जो बस यही करता है। सिवाय इसके कि मुझे कभी पता नहीं है कि यह अस्तित्व में है या इसे कैसे ढूंढें! – jeffalstott

उत्तर

6

शिफ्ट GroupBy खंड के उत्पादन पर काम करता है:

>>> df = pandas.DataFrame(numpy.random.randint(1,3, (10,5)), columns=['a','b','c','d','e']) 
>>> df 
    a b c d e 
0 2 1 2 1 1 
1 2 1 1 1 1 
2 1 2 2 1 2 
3 1 2 1 1 2 
4 2 2 1 1 2 
5 2 2 2 2 1 
6 2 2 1 1 1 
7 2 2 2 1 1 
8 2 2 2 2 1 
9 2 2 2 2 1 


for k, v in df.groupby('a'): 
    print k 
    print 'normal' 
    print v 
    print 'shifted' 
    print v.shift(1) 

1 
normal 
    a b c d e 
2 1 2 2 1 2 
3 1 2 1 1 2 
shifted 
    a b c d e 
2 NaN NaN NaN NaN NaN 
3 1 2 2 1 2 
2 
normal 
    a b c d e 
0 2 1 2 1 1 
1 2 1 1 1 1 
4 2 2 1 1 2 
5 2 2 2 2 1 
6 2 2 1 1 1 
7 2 2 2 1 1 
8 2 2 2 2 1 
9 2 2 2 2 1 
shifted 
    a b c d e 
0 NaN NaN NaN NaN NaN 
1 2 1 2 1 1 
4 2 1 1 1 1 
5 2 2 1 1 2 
6 2 2 2 2 1 
7 2 2 1 1 1 
8 2 2 2 1 1 
9 2 2 2 2 1 
+0

शिफ्ट के लिए डिफ़ॉल्ट परम 1 है इसलिए 'शिफ्ट (1)' सेट करने के लिए आवश्यक नहीं है, हालांकि यह निर्दिष्ट करके स्पष्ट कोड है – EdChum

9

@ EdChum की टिप्पणी इस सवाल का एक बेहतर जवाब है, तो मैं इसे यहाँ भावी पीढ़ी के लिए पोस्टिंग कर रहा हूँ:

df['B_shifted'] = df.groupby(['A'])['B'].transform(lambda x:x.shift())

या इसी तरह

df['B_shifted'] = df.groupby(['A'])['B'].transform('shift')

पूर्व नोटेशन अधिक लचीला है, उदाहरण के लिए (उदाहरण के लिए यदि आप 2 से स्थानांतरित करना चाहते हैं)। पांडा की

15

नए संस्करण अब एक समूह पर एक shift प्रदर्शन कर सकते हैं:

df['B_shifted'] = df.groupby(['A'])['B'].shift(1) 

ध्यान दें कि जब नीचेस्थानांतरण, यह पहले पंक्ति कि NaN है है।

संबंधित मुद्दे