কীভাবে ডেটাফ্রেম কলামগুলির ক্রম পরিবর্তন করবেন?


875

আমার কাছে নিম্নলিখিতগুলি রয়েছে DataFrame( df):

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(10, 5))

আমি নিয়োগের মাধ্যমে আরও কলাম (গুলি) যুক্ত করব:

df['mean'] = df.mean(1)

আমি কীভাবে কলামটিকে meanসামনের দিকে স্থানান্তর করতে পারি , অর্থাৎ অন্যান্য কলামগুলির ক্রমটি রেখে যাওয়া এটিকে প্রথম কলাম হিসাবে সেট করতে পারি?



1
সাধারণীকৃত নম্পপি-ভিত্তিক সমাধানের জন্য দেখুন কীভাবে একটি পান্ডাস ডেটা ফ্রেমে কলামটি স্থানান্তর করতে হয়, কেবল একটি কলাম স্তরকে ধরে নিবে , না MultiIndex
জেপিপি

উত্তর:


852

একটি সহজ উপায় হ'ল প্রয়োজন অনুযায়ী পুনরায় সাজানো কলামগুলির একটি তালিকা সহ ডেটাফ্রেমটিকে পুনরায় সাইন করা।

আপনার এখন এই কি:

In [6]: df
Out[6]:
          0         1         2         3         4      mean
0  0.445598  0.173835  0.343415  0.682252  0.582616  0.445543
1  0.881592  0.696942  0.702232  0.696724  0.373551  0.670208
2  0.662527  0.955193  0.131016  0.609548  0.804694  0.632596
3  0.260919  0.783467  0.593433  0.033426  0.512019  0.436653
4  0.131842  0.799367  0.182828  0.683330  0.019485  0.363371
5  0.498784  0.873495  0.383811  0.699289  0.480447  0.587165
6  0.388771  0.395757  0.745237  0.628406  0.784473  0.588529
7  0.147986  0.459451  0.310961  0.706435  0.100914  0.345149
8  0.394947  0.863494  0.585030  0.565944  0.356561  0.553195
9  0.689260  0.865243  0.136481  0.386582  0.730399  0.561593

In [7]: cols = df.columns.tolist()

In [8]: cols
Out[8]: [0L, 1L, 2L, 3L, 4L, 'mean']

colsআপনি যেভাবে চান তা পুনরায় সাজান । এইভাবে আমি শেষ উপাদানটিকে প্রথম অবস্থানে নিয়ে গেলাম:

In [12]: cols = cols[-1:] + cols[:-1]

In [13]: cols
Out[13]: ['mean', 0L, 1L, 2L, 3L, 4L]

তারপরে এই জাতীয় ডেটা ফ্রেমটিকে পুনরায় অর্ডার করুন:

In [16]: df = df[cols]  #    OR    df = df.ix[:, cols]

In [17]: df
Out[17]:
       mean         0         1         2         3         4
0  0.445543  0.445598  0.173835  0.343415  0.682252  0.582616
1  0.670208  0.881592  0.696942  0.702232  0.696724  0.373551
2  0.632596  0.662527  0.955193  0.131016  0.609548  0.804694
3  0.436653  0.260919  0.783467  0.593433  0.033426  0.512019
4  0.363371  0.131842  0.799367  0.182828  0.683330  0.019485
5  0.587165  0.498784  0.873495  0.383811  0.699289  0.480447
6  0.588529  0.388771  0.395757  0.745237  0.628406  0.784473
7  0.345149  0.147986  0.459451  0.310961  0.706435  0.100914
8  0.553195  0.394947  0.863494  0.585030  0.565944  0.356561
9  0.561593  0.689260  0.865243  0.136481  0.386582  0.730399

17
যদি আপনি "স্ট্রিং" এবং 'তালিকা' অবজেক্টগুলিকে একত্রিত করতে না পারেন তবে "নিশ্চিত হয়ে নিন যে আপনি [] কলসগুলিতে মান মানটি করেছেন: কলস = [কলস []]] + কলস [:]] + কলস [৮:]
মোয়াবডল

3
@ ফুবার এটি একটি সেট ইউনিয়ন নয় এটি দুটি আদেশযুক্ত তালিকার সমাহার।
আমান

3
@ আমান আমি কেবল দেখিয়ে দিচ্ছি যে আপনার কোডটি অবচিত হয়ে গেছে। আপনার পোস্টটি পরিচালনা করা আপনার বিবেচনার ভিত্তিতে।
FooBar

2
@FooBar, ধরণ colsহয় list; এমনকি এটি নকলকেও অনুমতি দেয় (যা ডেটাফ্রেমে ব্যবহারের সময় বাতিল করা হবে)। আপনি Indexঅবজেক্টের কথা ভাবছেন ।
Alexis

8
এর অর্থ সমস্ত ডেটা অনুলিপি করা, যা অত্যন্ত অদক্ষ। আমার ইচ্ছা ছিল কোনও অনুলিপি তৈরি না করেই পান্ডাদের এটি করার একটি উপায় ছিল।
কনস্টান্টিন

439

আপনি এটির মতোও কিছু করতে পারেন:

df = df[['mean', '0', '1', '2', '3']]

আপনি কলামগুলির তালিকা এর সাথে পেতে পারেন:

cols = list(df.columns.values)

আউটপুট উত্পাদন করবে:

['0', '1', '2', '3', 'mean']

... যা প্রথম ফাংশনে নামার আগে ম্যানুয়ালি পুনরায় সাজানো সহজ


8
আপনি তালিকা সহ কলামগুলির তালিকা পেতে পারেন (df.collines)
জিম

8
বাdf.columns.tolist()
জিম 22

আমার মতো নবাবিদের জন্য, আপনি কলস থেকে প্রাপ্ত তালিকাটি পুনরায় সাজিয়ে নিন। তারপরে ডিএফ = ডিএফ [কলস] অর্থাৎ পুনরায় সাজানো তালিকাটি কেবলমাত্র একটি সেট বন্ধনী ছাড়াই প্রথম এক্সপ্রেশনটিতে নেমে যায়।
সিড

কলাম নামে 3.x মধ্যে পূর্ণসংখ্যার হতে হবে df = df[['mean1', 0, 1, 2, 3]]
prosti থেকে

1
আমি মনে করি না যে এটি কোনও ভাল উত্তর কারণ এটি কোনও ডেটাফ্রেমের কলাম ক্রম কীভাবে পরিবর্তন করতে কোড সরবরাহ করে না। বলুন আমি একটি সিএসভি ফাইলকে প্যান্ডাস পিডি হিসাবে আমদানি করি pd.read_csv()। আপনার উত্তর কীভাবে কলাম ক্রম পরিবর্তন করতে ব্যবহার করা যেতে পারে?
রবভিহ

312

কলামের নামগুলি আপনি যে ক্রমটি চান তা কেবল নির্ধারণ করুন:

In [39]: df
Out[39]: 
          0         1         2         3         4  mean
0  0.172742  0.915661  0.043387  0.712833  0.190717     1
1  0.128186  0.424771  0.590779  0.771080  0.617472     1
2  0.125709  0.085894  0.989798  0.829491  0.155563     1
3  0.742578  0.104061  0.299708  0.616751  0.951802     1
4  0.721118  0.528156  0.421360  0.105886  0.322311     1
5  0.900878  0.082047  0.224656  0.195162  0.736652     1
6  0.897832  0.558108  0.318016  0.586563  0.507564     1
7  0.027178  0.375183  0.930248  0.921786  0.337060     1
8  0.763028  0.182905  0.931756  0.110675  0.423398     1
9  0.848996  0.310562  0.140873  0.304561  0.417808     1

In [40]: df = df[['mean', 4,3,2,1]]

এখন, 'গড়' কলামটি সামনে এলো:

In [41]: df
Out[41]: 
   mean         4         3         2         1
0     1  0.190717  0.712833  0.043387  0.915661
1     1  0.617472  0.771080  0.590779  0.424771
2     1  0.155563  0.829491  0.989798  0.085894
3     1  0.951802  0.616751  0.299708  0.104061
4     1  0.322311  0.105886  0.421360  0.528156
5     1  0.736652  0.195162  0.224656  0.082047
6     1  0.507564  0.586563  0.318016  0.558108
7     1  0.337060  0.921786  0.930248  0.375183
8     1  0.423398  0.110675  0.931756  0.182905
9     1  0.417808  0.304561  0.140873  0.310562

6
এটি একটি অনুলিপি না?
ব্যবহারকারী3226167

20
@ নিকোলাসমারলি - আপনার ডিএফে 1000 কলাম রয়েছে বলে যদি এটি পাওয়া যায় তবে এটি সেরা উত্তর নয়।
এজিএস

1
দেখে মনে হচ্ছে না আপনি <df>.columnsপ্রথমে দাবিটি পছন্দ করার মতো দায়িত্ব অর্পণ করেছেন
বোজর্কস এক নম্বর ভক্ত

8
অল্প সংখ্যক কলামের জন্য এটি সেরা উত্তর।
দংকিউ চোই

2
এটি @ ফ্রেডডিজিভির পূর্বের উত্তরের একটি অনুলিপি। এটির একটি গ্রহণযোগ্য উত্তর হওয়া উচিত, এটি নয়।
জেমস হিরশর্ন

134

35
এটি কি কোনও ভবিষ্যতের বৈশিষ্ট্য যুক্ত হতে পারে pandas? এরকম কিছু df.move(0,df.mean)?
জেসন

ওহ মানুষ, এটি এমনকি এটির মতোও কাজ করে df_metadata.insert(0,'Db_name',"raw_data")(কোডটি এই থ্রেডের সাথে প্রাসঙ্গিক নয়)
আইটোস

3
সুন্দর। এবং এটি জায়গায় হয়।
cucu8

2
এটি অন্যান্য একটি সমাধান ম্যানুয়ালি কলামের নাম টাইপ করার কারণে এটি একটি মাপের সমাধান।
সিকেএম

এটি একটি নতুন কলাম তৈরি করার সময়, ওপি-র প্রশ্নের জন্য কাজ করে, তবে এটি কোনও কলামটি সরানোর জন্য নয়; ফলাফল সরানোর চেষ্টা*** ValueError: cannot insert mean, already exists
স্পিনআপ

122

আপনার ক্ষেত্রে,

df = df.reindex(columns=['mean',0,1,2,3,4])

আপনি যা চান ঠিক তাই করবেন

আমার ক্ষেত্রে (সাধারণ ফর্ম):

df = df.reindex(columns=sorted(df.columns))
df = df.reindex(columns=(['opened'] + list([a for a in df.columns if a != 'opened']) ))

2
আমি সেট করার চেষ্টা করেছি copy=Falseতবে দেখে মনে হচ্ছে এটি reindex_axisএখনও অনুলিপি তৈরি করে।
কনস্টান্টিন

1
@ কনস্ট্যান্টিন আপনি কি এই সমস্যাটি সম্পর্কে আরও একটি প্রশ্ন তৈরি করতে পারেন? আরও প্রসঙ্গ থাকলে আরও ভাল হবে
আলভারো জোয়াও

57

আপনার পছন্দসই ক্রমে আপনার কলামগুলির একটি নতুন তালিকা তৈরি করতে হবে, তারপরে df = df[cols]এই নতুন ক্রমে কলামগুলি পুনরায় সাজানোর জন্য ব্যবহার করুন ।

cols = ['mean']  + [col for col in df if col != 'mean']
df = df[cols]

আপনি আরও সাধারণ পদ্ধতির ব্যবহার করতে পারেন। এই উদাহরণে, সর্বশেষ কলামটি (-1 দ্বারা নির্দেশিত) প্রথম কলাম হিসাবে sertedোকানো হয়েছে।

cols = [df.columns[-1]] + [col for col in df if col != df.columns[-1]]
df = df[cols]

কলামগুলি ডেটাফ্রেমে উপস্থিত থাকলে আপনি কোনও পছন্দসই ক্রমে পুনরায় অর্ডার করার জন্যও এই পদ্ধতিটি ব্যবহার করতে পারেন।

inserted_cols = ['a', 'b', 'c']
cols = ([col for col in inserted_cols if col in df] 
        + [col for col in df if col not in inserted_cols])
df = df[cols]

44
import numpy as np
import pandas as pd
df = pd.DataFrame()
column_names = ['x','y','z','mean']
for col in column_names: 
    df[col] = np.random.randint(0,100, size=10000)

আপনি নিম্নলিখিত সমাধানগুলি ব্যবহার করে দেখতে পারেন:

সমাধান 1:

df = df[ ['mean'] + [ col for col in df.columns if col != 'mean' ] ]

সমাধান 2:


df = df[['mean', 'x', 'y', 'z']]

সমাধান 3:

col = df.pop("mean")
df = df.insert(0, col.name, col)

সমাধান 4:

df.set_index(df.columns[-1], inplace=True)
df.reset_index(inplace=True)

সমাধান 5:

cols = list(df)
cols = [cols[-1]] + cols[:-1]
df = df[cols]

সমাধান 6:

order = [1,2,3,0] # setting column's order
df = df[[df.columns[i] for i in order]]

সময়ের তুলনা:

সমাধান 1:

সিপিইউ বার: ব্যবহারকারী 1.05 এমএস, sys: 35 µ গুলি, মোট: 1.08 এমএস ওয়াল সময়: 995 µs

সমাধান 2 :

সিপিইউ বার: ব্যবহারকারী 933 µ এস, সিএস: 0 এনএস, মোট: 933 Wall ওয়াল সময়: 800 µ সে

সমাধান 3 :

সিপিইউ বার: ব্যবহারকারী 0 এনএস, সিএস: 1.35 এমএস, মোট: 1.35 এমএস ওয়াল সময়: 1.08 এমএস

সমাধান 4 :

সিপিইউ বার: ব্যবহারকারী 1.23 এমএস, sys: 45 µs, মোট: 1.27 এমএস ওয়াল সময়: 986 µs

সমাধান 5 :

সিপিইউ বার: ব্যবহারকারী 1.09 এমএস, sys: 19, গুলি, মোট: 1.11 এমএস ওয়াল সময়: 949 µ সে

সমাধান 6 :

সিপিইউ বার: ব্যবহারকারী 955 µ গুলি, sys: 34 µ গুলি, মোট: 989 Wall ওয়াল সময়: 859 µ সে


1
এমন সুন্দর উত্তর, ধন্যবাদ।
কাসিমালবাকালি

1
সমাধান 1 হ'ল আমার যা প্রয়োজন তাই আমার অনেকগুলি কলাম রয়েছে (53), ধন্যবাদ
রত্নেশ

@ পিগার্ল উইকি মান বাস্তব আসল সময় দেখায়? (ব্যবহারকারী, sys, মোট বা প্রাচীর সময়)
sergzemsk

1
এটি আমার পক্ষে সমস্যার উত্তম উত্তর। অনেকগুলি সমাধান (আমার যেটি প্রয়োজন তার একটি সহ) এবং সহজ পদ্ধতির। ধন্যবাদ!
গুস্তাভো রটগারিং

1
সমাধান 6 (কোনও তালিকা উপলব্ধি নেই):df = df.iloc[:, [1, 2, 3, 0]]
দিমিত্রি কাজ

43

আগস্ট 2018 থেকে:

যদি আপনার কলামের নামগুলি টাইপ করতে খুব দীর্ঘ হয় তবে আপনি অবস্থানগুলি সহ পূর্ণসংখ্যার তালিকার মাধ্যমে নতুন ক্রমটি নির্দিষ্ট করতে পারেন:

ডেটা:

          0         1         2         3         4      mean
0  0.397312  0.361846  0.719802  0.575223  0.449205  0.500678
1  0.287256  0.522337  0.992154  0.584221  0.042739  0.485741
2  0.884812  0.464172  0.149296  0.167698  0.793634  0.491923
3  0.656891  0.500179  0.046006  0.862769  0.651065  0.543382
4  0.673702  0.223489  0.438760  0.468954  0.308509  0.422683
5  0.764020  0.093050  0.100932  0.572475  0.416471  0.389390
6  0.259181  0.248186  0.626101  0.556980  0.559413  0.449972
7  0.400591  0.075461  0.096072  0.308755  0.157078  0.207592
8  0.639745  0.368987  0.340573  0.997547  0.011892  0.471749
9  0.050582  0.714160  0.168839  0.899230  0.359690  0.438500

সাধারণ উদাহরণ:

new_order = [3,2,1,4,5,0]
print(df[df.columns[new_order]])  

          3         2         1         4      mean         0
0  0.575223  0.719802  0.361846  0.449205  0.500678  0.397312
1  0.584221  0.992154  0.522337  0.042739  0.485741  0.287256
2  0.167698  0.149296  0.464172  0.793634  0.491923  0.884812
3  0.862769  0.046006  0.500179  0.651065  0.543382  0.656891
4  0.468954  0.438760  0.223489  0.308509  0.422683  0.673702
5  0.572475  0.100932  0.093050  0.416471  0.389390  0.764020
6  0.556980  0.626101  0.248186  0.559413  0.449972  0.259181
7  0.308755  0.096072  0.075461  0.157078  0.207592  0.400591
8  0.997547  0.340573  0.368987  0.011892  0.471749  0.639745
9  0.899230  0.168839  0.714160  0.359690  0.438500  0.050582

এবং ওপির প্রশ্নের নির্দিষ্ট ক্ষেত্রে:

new_order = [-1,0,1,2,3,4]
df = df[df.columns[new_order]]
print(df)

       mean         0         1         2         3         4
0  0.500678  0.397312  0.361846  0.719802  0.575223  0.449205
1  0.485741  0.287256  0.522337  0.992154  0.584221  0.042739
2  0.491923  0.884812  0.464172  0.149296  0.167698  0.793634
3  0.543382  0.656891  0.500179  0.046006  0.862769  0.651065
4  0.422683  0.673702  0.223489  0.438760  0.468954  0.308509
5  0.389390  0.764020  0.093050  0.100932  0.572475  0.416471
6  0.449972  0.259181  0.248186  0.626101  0.556980  0.559413
7  0.207592  0.400591  0.075461  0.096072  0.308755  0.157078
8  0.471749  0.639745  0.368987  0.340573  0.997547  0.011892
9  0.438500  0.050582  0.714160  0.168839  0.899230  0.359690

এই পদ্ধতির মূল সমস্যাটি হ'ল একই কোডটি একাধিকবার কল করা প্রতিটি সময় বিভিন্ন ফলাফল তৈরি করে, তাই এক সতর্কতা অবলম্বন করা প্রয়োজন :)


17

এই ফাংশনটি আপনাকে কেবলমাত্র কয়েকটি আদেশের জন্য আপনার ডেটাসেটে প্রতিটি ভেরিয়েবল তালিকাভুক্ত করা এড়ানো যায়।

def order(frame,var):
    if type(var) is str:
        var = [var] #let the command take a string or list
    varlist =[w for w in frame.columns if w not in var]
    frame = frame[var+varlist]
    return frame 

এটি দুটি আর্গুমেন্ট লাগে, প্রথমটি ডেটাसेट, দ্বিতীয়টি হ'ল ডেটা সেটে কলামগুলি যা আপনি সামনে আনতে চান।

সুতরাং আমার ক্ষেত্রে ভেরিয়েবল এ 1, এ 2, বি 1, বি 2, মোট এবং তারিখ সহ ফ্রেম নামে আমার একটি ডেটা সেট রয়েছে। আমি যদি টোটালটিকে সামনে আনতে চাই তবে আমার যা করতে হবে তা হ'ল:

frame = order(frame,['Total'])

আমি যদি টোটাল এবং তারিখটি সামনে আনতে চাই তবে আমি তা করি:

frame = order(frame,['Total','Date'])

সম্পাদনা করুন:

এটির আর একটি দরকারী উপায় হ'ল, যদি আপনার কোনও অপরিচিত টেবিল থাকে এবং আপনি VAR1, VAR2 এর মতো কোনও নির্দিষ্ট শব্দগুলির সাথে ভেরিয়েবলগুলির সাথে সন্ধান করছেন ... আপনি এর মতো কিছু কার্যকর করতে পারেন:

frame = order(frame,[v for v in frame.columns if "VAR" in v])

17

আমি নিজেই একটি অনুরূপ প্রশ্নে দৌড়েছি এবং আমি যা স্থির করেছি তা কেবল যুক্ত করতে চেয়েছিলাম। reindex_axis() methodকলাম ক্রম পরিবর্তন করার জন্য আমি পছন্দ করেছি । এটি কাজ করেছে:

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

@ জর্জের মন্তব্যটির উপর ভিত্তি করে একটি বিকল্প পদ্ধতি:

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))

যদিও এর reindex_axisচেয়ে মাইক্রো বেনমার্কগুলিতে কিছুটা দ্রুত গতিতে বলে মনে হচ্ছে reindex, আমি মনে করি আমি এর প্রত্যক্ষতার জন্য পরবর্তীটি পছন্দ করি।


6
এটি একটি দুর্দান্ত সমাধান ছিল, তবে পুনর্নির্দেশের_অ্যাক্সিসগুলি হ্রাস করা হবে। আমি রিইন্ডেক্স ব্যবহার করেছি এবং এটি ঠিক কাজ করেছে।
জর্জে

15

সহজভাবে,

df = df[['mean'] + df.columns[:-1].tolist()]


এপিআই বদলে যেতে পারে, আপনি এটিও করতে পারেন ... order = df.columns.tolist() df['mean'] = df.mean(1) df.columns = ['mean'] + order
ন্যাপিটুপুলু জন

1
এর বিভিন্নতা আমার পক্ষে ভাল কাজ করেছে। বিদ্যমান তালিকার সাথে headers, এটি ডিক তৈরি করতে ব্যবহৃত হয়েছিল যা তখন ডেটা ফ্রেম তৈরি করতে ব্যবহৃত হত, আমি ফোন করেছিলাম df.reindex(columns=headers)। আমি যে সমস্যাটিই ছড়িয়ে দিয়েছিলাম তা হ'ল আমি ইতিমধ্যে ফোন করেছি df.set_index('some header name', inplace=True), সুতরাং যখন পুনর্নির্দেশটি করা হয়েছিল তখন এটি আর একটি কলাম যুক্ত some header nameকরেছে কারণ মূল কলামটি এখন সূচক। উপরে উল্লিখিত বাক্য গঠন হিসাবে, ['mean'] + df.columnsপাইথন দোভাষী আমাকে দেনIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
হংকং

1
@ হোলংমোর: আপনার পূর্ববর্তী কোডটি আমি জানি না, তবে সম্পাদনাটি কাজ করা উচিত (০.০৯.২ ব্যবহার করে)
নেপিটুপুলু

সম্পাদনাটি আসলে কাজ করে (আমি 0.20.2 এ আছি)। আমার ক্ষেত্রে, আমি যে কলামগুলি চাইছি তা ইতিমধ্যে পেয়েছি, তাই আমার মনে হয় df.reindex () আমার সত্যই ব্যবহার করা উচিত।
hlongmore

11

আপনি নিম্নলিখিতটি করতে পারেন (আমানের উত্তর থেকে অংশ ধার করা):

cols = df.columns.tolist()
cols.insert(0, cols.pop(-1))

cols
>>>['mean', 0L, 1L, 2L, 3L, 4L]

df = df[cols]

10

আপনি যে কলামটির নামটি পরিবর্তন করতে চান তা টাইপ করুন এবং নতুন অবস্থানের জন্য সূচকটি সেট করুন।

def change_column_order(df, col_name, index):
    cols = df.columns.tolist()
    cols.remove(col_name)
    cols.insert(index, col_name)
    return df[cols]

আপনার ক্ষেত্রে এটির মতো হবে:

df = change_column_order(df, 'mean', 0)


8

যে কোনও কলামকে যে কোনও অবস্থানে সরিয়ে নেওয়া হচ্ছে:

import pandas as pd
df = pd.DataFrame({"A": [1,2,3], 
                   "B": [2,4,8], 
                   "C": [5,5,5]})

cols = df.columns.tolist()
column_to_move = "C"
new_position = 1

cols.insert(new_position, cols.pop(cols.index(column_to_move)))
df = df[cols]

7

আমি মনে করি এটি একটি সামান্যতম সমাধান:

df.insert(0,'mean', df.pop("mean"))

এই সমাধানটি @ জোহেফারের সমাধানের সাথে কিছুটা মিল তবে এটি একটি লাইনার।

এখানে আমরা "mean"ডেটাফ্রেম থেকে কলামটি সরিয়েছি এবং এটি 0একই কলামের নামের সাথে সূচীতে সংযুক্ত করি ।


5

বিদ্যমান কলামটি স্থানান্তরিত করার জন্য এখানে একটি উপায় যা বিদ্যমান ডেটা ফ্রেমটিকে ঠিক জায়গায় পরিবর্তন করবে।

my_column = df.pop('column name')
df.insert(3, my_column.name, my_column)

5

এই প্রশ্নের উত্তর আগে দেওয়া হয়েছিল কিন্তু reindex_axis এখন হ্রাস করা হয়েছে তাই আমি ব্যবহার করার পরামর্শ দেব:

df.reindex(sorted(df.columns), axis=1)

19
না, এটা আলাদা। সেখানে ব্যবহারকারী নাম অনুসারে সমস্ত কলামগুলি বাছাই করতে চায়। এখানে তারা অন্য কলামগুলির ক্রমটি অচ্ছুত রেখে একটি কলাম প্রথম কলামে নিয়ে যেতে চান।
smci

1
আপনি যদি সেগুলি বাছাই করতে চান না তবে কী হবে?
চানকি পাঠক

এটি একটি অনুলিপি ফেরত দেয়, জায়গায় কাজ করে না
স্পিনআপ

3

"টি" ব্যবহার সম্পর্কে কীভাবে?

df.T.reindex(['mean',0,1,2,3,4]).T

3

@ ক্লোকার: আপনার সমাধানটি আমার পক্ষে খুব সহায়ক ছিল, কারণ আমি একটি ডেটা ফ্রেম থেকে সামনে দুটি কলাম আনতে চেয়েছিলাম যেখানে সমস্ত কলামের নামগুলি ঠিক জানি না, কারণ সেগুলি আগে একটি পাইভট বিবৃতি থেকে উত্পন্ন হয়েছিল। সুতরাং, আপনি যদি একই পরিস্থিতিতে থাকেন: কলামগুলি সামনে আনার জন্য যেটির নাম আপনি জানেন এবং তারপরে তাদের "অন্যান্য সমস্ত কলামগুলি" অনুসরণ করুন, আমি নিম্নলিখিত সাধারণ সমাধানটি নিয়ে এসেছি;

df = df.reindex_axis(['Col1','Col2'] + list(df.columns.drop(['Col1','Col2'])), axis=1)

3

set():

একটি সাধারণ পদ্ধতির ব্যবহার করা হচ্ছে set(), বিশেষত যখন আপনার কলামগুলির দীর্ঘ তালিকা রয়েছে এবং সেগুলি ম্যানুয়ালি হ্যান্ডেল করতে চান না:

cols = list(set(df.columns.tolist()) - set(['mean']))
cols.insert(0, 'mean')
df = df[cols]

2
একটি সতর্কতা: আপনি যদি সেট এ রেখে দেন তবে কলামগুলির ক্রম চলে যাবে
pvarma

মজাদার! @ ব্যবহারকারী1930402 আমি উপরের পদ্ধতিটি বেশ কয়েকটি অনুষ্ঠানে চেষ্টা করেছি এবং কখনও কোনও সমস্যা হয়নি had আমি আবার ডাবল চেক করব।
শোরেশ

2

আমি শোরেশের উত্তর পছন্দ করেছিআপনি যখন অবস্থানটি জানেন না তখন কলামগুলি সরিয়ে ফেলার জন্য সেট কার্যকারিতা ব্যবহার করার জন্য , তবে এটি আমার উদ্দেশ্যটির জন্য কাজ করে নি কারণ আমাকে মূল কলামের আদেশ রাখতে হবে (যার মধ্যে নির্বিচারে কলাম লেবেল রয়েছে)।

বোল্টন প্যাকেজ থেকে ইনডেক্সডসেট ব্যবহার করেও আমি এটি কাজ করতে পেরেছি।

আমার একাধিক কলাম লেবেল পুনরায় যুক্ত করা দরকার ছিল, সুতরাং আরও সাধারণ ক্ষেত্রে আমি নিম্নলিখিত কোডটি ব্যবহার করেছি:

from boltons.setutils import IndexedSet
cols = list(IndexedSet(df.columns.tolist()) - set(['mean', 'std']))
cols[0:0] =['mean', 'std']
df = df[cols]

আশা করি সাধারণ সমাধানের জন্য এই থ্রেডটি অনুসন্ধান করা যে কারও পক্ষে এটি কার্যকর।


আমি কিছুটা অবাক! আমি setএই উদ্দেশ্যটির জন্য প্রায়শই ব্যবহার করি এবং কখনই আদেশের সাথে ডিল করতে হয় নি।
শোরেশ

2

আপনি reindexউভয় অক্ষের জন্য ব্যবহার করতে পারেন যা ব্যবহার করতে পারেন :

df
#           0         1         2         3         4      mean
# 0  0.943825  0.202490  0.071908  0.452985  0.678397  0.469921
# 1  0.745569  0.103029  0.268984  0.663710  0.037813  0.363821
# 2  0.693016  0.621525  0.031589  0.956703  0.118434  0.484254
# 3  0.284922  0.527293  0.791596  0.243768  0.629102  0.495336
# 4  0.354870  0.113014  0.326395  0.656415  0.172445  0.324628
# 5  0.815584  0.532382  0.195437  0.829670  0.019001  0.478415
# 6  0.944587  0.068690  0.811771  0.006846  0.698785  0.506136
# 7  0.595077  0.437571  0.023520  0.772187  0.862554  0.538182
# 8  0.700771  0.413958  0.097996  0.355228  0.656919  0.444974
# 9  0.263138  0.906283  0.121386  0.624336  0.859904  0.555009

df.reindex(['mean', *range(5)], axis=1)

#        mean         0         1         2         3         4
# 0  0.469921  0.943825  0.202490  0.071908  0.452985  0.678397
# 1  0.363821  0.745569  0.103029  0.268984  0.663710  0.037813
# 2  0.484254  0.693016  0.621525  0.031589  0.956703  0.118434
# 3  0.495336  0.284922  0.527293  0.791596  0.243768  0.629102
# 4  0.324628  0.354870  0.113014  0.326395  0.656415  0.172445
# 5  0.478415  0.815584  0.532382  0.195437  0.829670  0.019001
# 6  0.506136  0.944587  0.068690  0.811771  0.006846  0.698785
# 7  0.538182  0.595077  0.437571  0.023520  0.772187  0.862554
# 8  0.444974  0.700771  0.413958  0.097996  0.355228  0.656919
# 9  0.555009  0.263138  0.906283  0.121386  0.624336  0.859904

2

যে কোনও কলামের জন্য এটি করার জন্য এখানে একটি ফাংশন।

def mean_first(df):
    ncols = df.shape[1]        # Get the number of columns
    index = list(range(ncols)) # Create an index to reorder the columns
    index.insert(0,ncols)      # This puts the last column at the front
    return(df.assign(mean=df.mean(1)).iloc[:,index]) # new df with last column (mean) first


2

আমি মনে করি এই ফাংশনটি আরও সহজবোধ্য। শুরু বা শেষে বা উভয় ক্ষেত্রেই আপনাকে কলামগুলির একটি উপসেট নির্দিষ্ট করতে হবে:

def reorder_df_columns(df, start=None, end=None):
    """
        This function reorder columns of a DataFrame.
        It takes columns given in the list `start` and move them to the left.
        Its also takes columns in `end` and move them to the right.
    """
    if start is None:
        start = []
    if end is None:
        end = []
    assert isinstance(start, list) and isinstance(end, list)
    cols = list(df.columns)
    for c in start:
        if c not in cols:
            start.remove(c)
    for c in end:
        if c not in cols or c in start:
            end.remove(c)
    for c in start + end:
        cols.remove(c)
    cols = start + cols + end
    return df[cols]

1

আমি বিশ্বাস করি @ আমনের উত্তরটি যদি আপনি অন্য কলামের অবস্থান জানেন তবে সেরা।

যদি আপনি এর অবস্থানটি না জানেন meanতবে কেবল এর নামটি থাকে তবে আপনি সরাসরি অবলম্বন করতে পারবেন না cols = cols[-1:] + cols[:-1]। নিম্নলিখিতটি আমি পরবর্তী যে সেরা জিনিসটি নিয়ে আসতে পারি তা নিম্নলিখিত:

meanDf = pd.DataFrame(df.pop('mean'))
# now df doesn't contain "mean" anymore. Order of join will move it to left or right:
meanDf.join(df) # has mean as first column
df.join(meanDf) # has mean as last column

1

কেবল উল্টানো প্রায়ই সাহায্য করে।

df[df.columns[::-1]]

অথবা কেবল একবার দেখার জন্য পরিবর্তন করুন।

import random
cols = list(df.columns)
random.shuffle(cols)
df[cols]

0

বেশিরভাগ উত্তরগুলি যথেষ্ট পরিমাণে সাধারণীকরণ করেনি এবং পান্ডাস রিইন্ডেক্স_এক্সিস পদ্ধতিটি কিছুটা ক্লান্তিকর, তাই আমি একটি অভিধান ব্যবহার করে এমন কোনও অভিধানে একটি নির্বিচার সংখ্যক কলামগুলিকে সরিয়ে দেওয়ার জন্য একটি সাধারণ ফাংশন অফার করি যেখানে কী = কলামের নাম এবং মান = অবস্থানের দিকে যেতে হবে। যদি আপনার ডেটাফ্রেমটি বড় হয়ে যায় তবে 'বিগ_ডাটা' থেকে সত্য হয় তবে ফাংশনটি আদেশযুক্ত কলামগুলির তালিকাটি ফিরিয়ে দেবে। এবং আপনি এই তালিকাটি আপনার ডেটা টুকরো টুকরো করতে ব্যবহার করতে পারেন।

def order_column(df, columns, big_data = False):

    """Re-Orders dataFrame column(s)
       Parameters : 
       df      -- dataframe
       columns -- a dictionary:
                  key   = current column position/index or column name
                  value = position to move it to  
       big_data -- boolean 
                  True = returns only the ordered columns as a list
                          the user user can then slice the data using this
                          ordered column
                  False = default - return a copy of the dataframe
    """
    ordered_col = df.columns.tolist()

    for key, value in columns.items():

        ordered_col.remove(key)
        ordered_col.insert(value, key)

    if big_data:

        return ordered_col

    return df[ordered_col]

# e.g.
df = pd.DataFrame({'chicken wings': np.random.rand(10, 1).flatten(), 'taco': np.random.rand(10,1).flatten(),
                          'coffee': np.random.rand(10, 1).flatten()})
df['mean'] = df.mean(1)

df = order_column(df, {'mean': 0, 'coffee':1 })

>>>

আউটপুট

col = order_column(df, {'mean': 0, 'coffee':1 }, True)

col
>>>
['mean', 'coffee', 'chicken wings', 'taco']

# you could grab it by doing this

df = df[col]

0

পান্ডে কলামের নামগুলি পুনরায় অর্ডার করার জন্য আমার খুব নির্দিষ্ট ব্যবহারের কেস রয়েছে। কখনও কখনও আমি একটি বিদ্যমান কলামের উপর ভিত্তি করে ডেটা ফ্রেমে একটি নতুন কলাম তৈরি করছি। ডিফল্টরূপে পান্ডগুলি শেষে আমার নতুন কলামটি প্রবেশ করবে, তবে আমি চাই যে নতুন কলামটি এটি থেকে প্রাপ্ত বিদ্যমান কলামের পাশে সন্নিবেশ করাতে হবে।

এখানে চিত্র বর্ণনা লিখুন

def rearrange_list(input_list, input_item_to_move, input_item_insert_here):
    '''
    Helper function to re-arrange the order of items in a list.
    Useful for moving column in pandas dataframe.

    Inputs:
        input_list - list
        input_item_to_move - item in list to move
        input_item_insert_here - item in list, insert before 

    returns:
        output_list
    '''
    # make copy for output, make sure it's a list
    output_list = list(input_list)

    # index of item to move
    idx_move = output_list.index(input_item_to_move)

    # pop off the item to move
    itm_move = output_list.pop(idx_move)

    # index of item to insert here
    idx_insert = output_list.index(input_item_insert_here)

    # insert item to move into here
    output_list.insert(idx_insert, itm_move)

    return output_list


import pandas as pd

# step 1: create sample dataframe
df = pd.DataFrame({
    'motorcycle': ['motorcycle1', 'motorcycle2', 'motorcycle3'],
    'initial_odometer': [101, 500, 322],
    'final_odometer': [201, 515, 463],
    'other_col_1': ['blah', 'blah', 'blah'],
    'other_col_2': ['blah', 'blah', 'blah']
})
print('Step 1: create sample dataframe')
display(df)
print()

# step 2: add new column that is difference between final and initial
df['change_odometer'] = df['final_odometer']-df['initial_odometer']
print('Step 2: add new column')
display(df)
print()

# step 3: rearrange columns
ls_cols = df.columns
ls_cols = rearrange_list(ls_cols, 'change_odometer', 'final_odometer')
df=df[ls_cols]
print('Step 3: rearrange columns')
display(df)

0

আমার পক্ষে কাজ করা একটি দুর্দান্ত সোজা সমাধান হ'ল df.colالms .reindex ব্যবহার করুন:

df=df[df.columns.reindex(['mean',0,1,2,3,4])[0]]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.