পান্ডাস ডেটা ফ্রেমে কোনও কলাম কীভাবে স্থানান্তর করবেন


102

আমি একটি পান্ডায় একটি কলাম স্থানান্তর করতে চাই 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

4
শিফট কার্যক্রমে এটি সত্যিই একটি flag
চ্ছিক

উত্তর:


156
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 অনুপস্থিত। শিফট ব্যবহার করার সময় প্যানডাসে সূচক বাড়ানোর কোনও সহজ উপায় আছে কি?
ওয়েলন ওয়াকার 15

@ ওয়েলনওয়ালাকার যাকে নাম্বারে রোলিং বলা হয়:df['x2'] = np.roll(df['x2'], 1)
অায়হান

4
কেউ কি এটি খুঁজে বের করতে পারে? # 5 এখনও নিখোঁজ রয়েছে
ক্রিটজ

আমাকে একইভাবে 100 টি কলাম স্থানান্তর করতে হবে, আমি কীভাবে লুপ তৈরি করতে পারি?
ভিনসেন্ট রয়

4
@ জোহান আপনি কী স্থানান্তরিত করার আগে একটি ফাঁকা সারি যুক্ত করার চেষ্টা করেছিলেন?
মাইকী

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)

4
স্ট্যাকওভারফ্লোতে স্বাগতম। আপনার উত্তরটি আরও সহায়ক হবে যদি আপনি এটি কীভাবে ব্যবহার করা উচিত তার কিছু ব্যাখ্যা সরবরাহ করেন।
সাইমন.এসএ

4
আবার আপনি একটি সারিতে # 5 হারিয়েছেন যা ওপি স্পষ্টভাবে চায়
KIC

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/...
ওল্ডস্কুল

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

এটি নতুন ডিএফ ডিএফ 2 তৈরি করবে। হয়তো আরও মার্জিত উপায় আছে তবে এটি কাজ করে।

এখন আপনি এটি স্থানান্তর করতে পারেন:

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

2

একটি ব্যক্তিগত সমস্যার উত্তর দেওয়ার চেষ্টা করা হচ্ছে এবং আপনার মতোই আমি পান্ডাস ডকের কাছে পেয়েছি যা আমার মনে হয় এই প্রশ্নের উত্তর দেবে:

ডেটাফ্রেম.শিফ্ট ( পিরিয়ডস = 1, ফ্রিক = কোনটি নয়, অক্ষ = 0) একটি alচ্ছিক সময় ফ্রিক্স সহ পছন্দসই সংখ্যার পিরিয়ড দ্বারা শিফট সূচক

মন্তব্য

যদি ফ্রিক নির্দিষ্ট করা থাকে তবে সূচীর মানগুলি স্থানান্তরিত হয় তবে ডেটাটি সত্যায়িত হয় না। এটি হ'ল, যদি আপনি মূল ডেটা স্থানান্তরিত এবং সংরক্ষণের সময় সূচকটি প্রসারিত করতে চান তবে ফ্রিক ব্যবহার করুন।

এই বিষয়ে ভবিষ্যতের প্রশ্নগুলি সহায়তা করার আশাবাদী।


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)

মূলত আমি কাঙ্ক্ষিত সূচকের সাথে একটি খালি ডেটাফ্রেম তৈরি করছি এবং তারপরে কেবল তাদের একসাথে সংযুক্ত করে তুলছি। তবে আমি সত্যিই এটিকে পান্ডাসগুলিতে একটি আদর্শ বৈশিষ্ট্য হিসাবে দেখতে চাই তাই আমি পান্ডাদের বর্ধনের প্রস্তাব করেছি ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.