पांडस डेटाफ्रैम में एक कॉलम को कैसे शिफ्ट किया जाए


101

मैं एक पंडों में एक कॉलम को स्थानांतरित करना चाहता हूं DataFrame, लेकिन मैं पूरे डीएफ को फिर से लिखने के बिना प्रलेखन से इसे करने के लिए एक विधि खोजने में सक्षम नहीं हूं। क्या कोई जानता है इसे कैसे करना है? डेटा ढांचा:

##    x1   x2
##0  206  214
##1  226  234
##2  245  253
##3  265  272
##4  283  291

वांछित उत्पादन:

##    x1   x2
##0  206  nan
##1  226  214
##2  245  234
##3  265  253
##4  283  272
##5  nan  291

3
यह वास्तव में शिफ्ट फ़ंक्शन का एक वैकल्पिक ध्वज होना चाहिए
KIC

जवाबों:


155
In [18]: a
Out[18]: 
   x1  x2
0   0   5
1   1   6
2   2   7
3   3   8
4   4   9

In [19]: a.x2 = a.x2.shift(1)

In [20]: a
Out[20]: 
   x1  x2
0   0 NaN
1   1   5
2   2   6
3   3   7
4   4   8

9
परिणाम ## 5 गायब है। क्या शिफ्ट का उपयोग करते समय सूचकांक का विस्तार करने के लिए पांडा में एक आसान तरीका है?
वायलन वाकर

@AylonWalker को सुन्न में रोलिंग कहा जाता है:df['x2'] = np.roll(df['x2'], 1)
ayhan

1
क्या किसी ने यह पता लगाया? # 5 अभी भी लापता है
क्रिट्ज़

मुझे उसी तरह 100 कॉलम को शिफ्ट करना होगा, मैं लूप के लिए कैसे बना सकता हूं?
विंसेंट रॉय

2
@ जोहान आपने शिफ्ट करने से पहले आखिर में एक खाली पंक्ति जोड़ने की कोशिश की?
मिकी

8

आपको df.shiftयहां उपयोग करने की आवश्यकता है। इकाइयों
df.shift(i)द्वारा संपूर्ण डेटाफ़्रेम को iनीचे स्थानांतरित करता है ।

तो, इसके लिए i = 1:

इनपुट:

    x1   x2  
0  206  214  
1  226  234  
2  245  253  
3  265  272    
4  283  291

आउटपुट:

    x1   x2
0  Nan  Nan   
1  206  214  
2  226  234  
3  245  253  
4  265  272 

इसलिए, अपेक्षित आउटपुट पाने के लिए इस स्क्रिप्ट को चलाएं:

import pandas as pd

df = pd.DataFrame({'x1': ['206', '226', '245',' 265', '283'],
                   'x2': ['214', '234', '253', '272', '291']})

print(df)
df['x2'] = df['x2'].shift(1)
print(df)

3
Stackoverflow में आपका स्वागत है। यदि आप इसका उपयोग कैसे करना चाहिए, इसका कुछ विवरण प्रदान करने पर आपका उत्तर अधिक उपयोगी होगा।
साइमन.SA

1
फिर से आपने एक पंक्ति # 5 खो दी है जो ओपी स्पष्ट रूप से चाहता है
केआईसी

6

अपने उदाहरण से डेटाफ्रेम को परिभाषित करें

>>> df = pd.DataFrame([[206, 214], [226, 234], [245, 253], [265, 272], [283, 291]], 
    columns=[1, 2])
>>> df
     1    2
0  206  214
1  226  234
2  245  253
3  265  272
4  283  291

तब आप दूसरे कॉलम के सूचकांक में फेरबदल कर सकते हैं

>>> df[2].index = df[2].index+1

और अंत में एकल कॉलम को फिर से संयोजित करें

>>> pd.concat([df[1], df[2]], axis=1)
       1      2
0  206.0    NaN
1  226.0  214.0
2  245.0  234.0
3  265.0  253.0
4  283.0  272.0
5    NaN  291.0

शायद उपवास नहीं है लेकिन पढ़ने में सरल है। कॉलम नामों और आवश्यक वास्तविक बदलाव के लिए चर सेट करने पर विचार करें।

संपादित करें: आम तौर पर शिफ्टिंग df[2].shift(1)पहले से पोस्ट किए गए द्वारा संभव है, हालांकि कैरीओवर में कटौती होगी।


मुझे आश्चर्य है कि ऐसा करने का कोई तेज़ तरीका है, और किसी दिनांक अनुक्रमणिका का उपयोग करके, अनिवार्य रूप से आप हमारी श्रृंखला को समाप्त किए बिना स्थानांतरित करना चाहते हैं, और इस प्रकार आपको अतिरिक्त सूचकांक मान निर्दिष्ट करना होगा। एक के बाद एक बदलाव के लिए, आप सीरीज़.शिफ्ट (-1, फिल = [डेटाइम (<कुछ तारीख>)]) को कुछ कहेंगे। क्या ऐसा कुछ संभव है? आह यह पाया यहाँ stackoverflow.com/questions/36042804/…
OldSchool

5

यदि आप अपने डेटाफ़्रेम के अंत में अपने द्वारा स्थानांतरित किए गए कॉलम को खोना नहीं चाहते हैं , तो बस आवश्यक संख्या पहले जोड़ें:

    offset = 5
    DF = DF.append([np.nan for x in range(offset)])
    DF = DF.shift(periods=offset)
    DF = DF.reset_index() #Only works if sequential index

3

मुझे लगता है कि आयात

import pandas as pd
import numpy as np

पहले NaN, NaN,...डेटाफ़्रेम ( df) के अंत में नई पंक्ति जोड़ें ।

s1 = df.iloc[0]    # copy 1st row to a new Series s1
s1[:] = np.NaN     # set all values to NaN
df2 = df.append(s1, ignore_index=True)  # add s1 to the end of df

यह नया DF df2 बनाएगा। हो सकता है कि अधिक सुंदर तरीका हो लेकिन यह काम करता है।

अब आप इसे शिफ्ट कर सकते हैं:

df2.x2 = df2.x2.shift(1)  # shift what you want

2

एक व्यक्तिगत समस्या और आपके समान जवाब देने की कोशिश मैं पंडों डॉक्टर पर पाया कि मुझे क्या लगता है कि मैं इस सवाल का जवाब दूंगा:

DataFrame.shift (अवधि = 1, freq = कोई नहीं, अक्ष = 0) एक वैकल्पिक वैकल्पिक freq के साथ वांछित संख्या में समय सूचकांक को शिफ्ट करें।

टिप्पणियाँ

यदि फ्रीक निर्दिष्ट किया जाता है तो सूचकांक मानों को स्थानांतरित कर दिया जाता है लेकिन डेटा को पुन: असाइन नहीं किया जाता है। यदि आप स्थानांतरण करते समय और मूल डेटा को संरक्षित करना चाहते हैं, तो फ़्रीक का उपयोग करें।

इस मामले में भविष्य के सवालों में मदद करने की उम्मीद है।


0

यह मेरा इसे करने का तरीका है:

df_ext = pd.DataFrame(index=pd.date_range(df.index[-1], periods=8, closed='right'))
df2 = pd.concat([df, df_ext], axis=0, sort=True)
df2["forecast"] = df2["some column"].shift(7)

मूल रूप से मैं वांछित सूचकांक के साथ एक खाली डेटाफ़्रेम पैदा कर रहा हूं और फिर उन्हें एक साथ मिलाता हूं। लेकिन मैं इसे वास्तव में पंडों में एक मानक विशेषता के रूप में देखना चाहता हूं इसलिए मैंने पंडों को बढ़ाने का प्रस्ताव दिया है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.