পান্ডে টেবিলের সামনে কলামটি নাম দিয়ে সরান


97

এখানে আমার df:

                             Net   Upper   Lower  Mid  Zsore
Answer option                                                
More than once a day          0%   0.22%  -0.12%   2    65 
Once a day                    0%   0.32%  -0.19%   3    45
Several times a week          2%   2.45%   1.10%   4    78
Once a week                   1%   1.63%  -0.40%   6    65

আমি নাম ( "Mid") দ্বারা একটি কলাম কীভাবে টেবিলের সামনে, সূচী 0 তে সরাতে পারি This ফলাফলটি দেখতে এমন হওয়া উচিত:

                             Mid   Upper   Lower  Net  Zsore
Answer option                                                
More than once a day          2   0.22%  -0.12%   0%    65 
Once a day                    3   0.32%  -0.19%   0%    45
Several times a week          4   2.45%   1.10%   2%    78
Once a week                   6   1.63%  -0.40%   1%    65

আমার বর্তমান কোডটি ব্যবহার করে কলামটি সূচী দ্বারা সরিয়ে নিয়েছে df.columns.tolist()তবে আমি এটি নাম দিয়ে শিফট করতে চাই।

উত্তর:


114

আমরা ixএকটি তালিকা পাস করে পুনঃক্রম করতে ব্যবহার করতে পারি :

In [27]:
# get a list of columns
cols = list(df)
# move the column to head of list using index, pop and insert
cols.insert(0, cols.pop(cols.index('Mid')))
cols
Out[27]:
['Mid', 'Net', 'Upper', 'Lower', 'Zsore']
In [28]:
# use ix to reorder
df = df.ix[:, cols]
df
Out[28]:
                      Mid Net  Upper   Lower  Zsore
Answer_option                                      
More_than_once_a_day    2  0%  0.22%  -0.12%     65
Once_a_day              3  0%  0.32%  -0.19%     45
Several_times_a_week    4  2%  2.45%   1.10%     78
Once_a_week             6  1%  1.63%  -0.40%     65

আরেকটি পদ্ধতি হ'ল কলামটির একটি রেফারেন্স নেওয়া এবং এটি সামনের দিকে পুনরায় সন্নিবেশ করানো:

In [39]:
mid = df['Mid']
df.drop(labels=['Mid'], axis=1,inplace = True)
df.insert(0, 'Mid', mid)
df
Out[39]:
                      Mid Net  Upper   Lower  Zsore
Answer_option                                      
More_than_once_a_day    2  0%  0.22%  -0.12%     65
Once_a_day              3  0%  0.32%  -0.19%     45
Several_times_a_week    4  2%  2.45%   1.10%     78
Once_a_week             6  1%  1.63%  -0.40%     65

আপনি locএকই ফলাফল অর্জন করতে ব্যবহার করতে পারেন যা ixপাণ্ডার ভবিষ্যতের সংস্করণে অবনমিত হবে 0.20.0:

df = df.loc[:, cols]

54

সম্ভবত আমি কিছু মিস করছি, তবে এই উত্তরগুলির অনেকগুলি অতিরিক্ত জটিল বলে মনে হচ্ছে। আপনার কেবলমাত্র একটি একক তালিকার মধ্যে কলামগুলি সেট করতে সক্ষম হওয়া উচিত:

সামনের দিকে কলাম:

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

অথবা পরিবর্তে, আপনি এটি পিছনে সরাতে চান:

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

অথবা আপনি যদি একাধিক কলাম সরিয়ে নিতে চান:

cols_to_move = ['Mid', 'Zsore']
df           = df[ cols_to_move + [ col for col in df.columns if col not in cols_to_move ] ]

অন্য কেউ জন্য, আপনি বিকল্প ব্যবহার 3. একাধিক কলাম সঙ্গে বিকল্প 1 মুছে যাবে না একাধিক কলাম জন্য নিশ্চিত MidZscoreমূল অবস্থান থেকে কলাম থেকে। Grouperএকই কলামটি যখন দু'বার সেখানে ছিল তখন আমি গ্রুপপাইয়ের চেষ্টা করার সময় একটি ত্রুটি সহ এটি খুঁজে পেয়েছি ।
the775

46

আপনি পান্ডসে df.reindex () ফাংশনটি ব্যবহার করতে পারেন। ডিএফ হয়

                      Net  Upper   Lower  Mid  Zsore
Answer option                                      
More than once a day  0%  0.22%  -0.12%    2     65
Once a day            0%  0.32%  -0.19%    3     45
Several times a week  2%  2.45%   1.10%    4     78
Once a week           1%  1.63%  -0.40%    6     65

কলাম নামের একটি তালিকা নির্ধারণ করুন

cols = df.columns.tolist()
cols
Out[13]: ['Net', 'Upper', 'Lower', 'Mid', 'Zsore']

কলামের নাম আপনি যেখানেই চান সেখানে সরিয়ে নিন

cols.insert(0, cols.pop(cols.index('Mid')))
cols
Out[16]: ['Mid', 'Net', 'Upper', 'Lower', 'Zsore']

তারপরে df.reindex()পুনঃক্রম করতে ফাংশনটি ব্যবহার করুন

df = df.reindex(columns= cols)

আউট পুট হল: ডিএফ

                      Mid  Upper   Lower Net  Zsore
Answer option                                      
More than once a day    2  0.22%  -0.12%  0%     65
Once a day              3  0.32%  -0.19%  0%     45
Several times a week    4  2.45%   1.10%  2%     78
Once a week             6  1.63%  -0.40%  1%     65

30

আমি এই সমাধানটি পছন্দ করি:

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

এটি পড়ার জন্য সহজ এবং অন্যান্য প্রস্তাবিত উত্তরের চেয়ে দ্রুত।

def move_column_inplace(df, col, pos):
    col = df.pop(col)
    df.insert(pos, col.name, col)

কর্মক্ষমতা মূল্যায়ন:

এই পরীক্ষার জন্য, বর্তমানে সর্বশেষ কলামটি প্রতিটি পুনরাবৃত্তির সম্মুখভাগে সরানো হয়েছে। ইন-প্লেস পদ্ধতিগুলি সাধারণত আরও ভাল সম্পাদন করে। যদিও সিটিএনরম্যানের সমাধানটি স্থানে তৈরি করা যায়, এড .locচামের পদ্ধতি ভিত্তিক এবং সাচিন্মের পদ্ধতিটি reindexপারবেন না এর ভিত্তিতে ।

অন্য পদ্ধতিগুলি জেনেরিক হলেও সিটিএনরম্যানের সমাধান সীমাবদ্ধ pos=0। আমি df.loc[cols]এবং এর মধ্যে কোনও পারফরম্যান্সের পার্থক্য পর্যবেক্ষণ করি নি df[cols], এজন্য আমি কিছু অন্যান্য পরামর্শ অন্তর্ভুক্ত করি নি।

আমি একটি ম্যাকবুক প্রো (মধ্য 2015) তে অজগর 3.6.8 এবং পান্ডাস 0.24.2 দিয়ে পরীক্ষা করেছি।

import numpy as np
import pandas as pd

n_cols = 11
df = pd.DataFrame(np.random.randn(200000, n_cols),
                  columns=range(n_cols))

def move_column_inplace(df, col, pos):
    col = df.pop(col)
    df.insert(pos, col.name, col)

def move_to_front_normanius_inplace(df, col):
    move_column_inplace(df, col, 0)
    return df

def move_to_front_chum(df, col):
    cols = list(df)
    cols.insert(0, cols.pop(cols.index(col)))
    return df.loc[:, cols]

def move_to_front_chum_inplace(df, col):
    col = df[col]
    df.drop(col.name, axis=1, inplace=True)
    df.insert(0, col.name, col)
    return df

def move_to_front_elpastor(df, col):
    cols = [col] + [ c for c in df.columns if c!=col ]
    return df[cols] # or df.loc[cols]

def move_to_front_sachinmm(df, col):
    cols = df.columns.tolist()
    cols.insert(0, cols.pop(cols.index(col)))
    df = df.reindex(columns=cols, copy=False)
    return df

def move_to_front_citynorman_inplace(df, col):
    # This approach exploits that reset_index() moves the index
    # at the first position of the data frame.
    df.set_index(col, inplace=True)
    df.reset_index(inplace=True)
    return df

def test(method, df):
    col = np.random.randint(0, n_cols)
    method(df, col)

col = np.random.randint(0, n_cols)
ret_mine = move_to_front_normanius_inplace(df.copy(), col)
ret_chum1 = move_to_front_chum(df.copy(), col)
ret_chum2 = move_to_front_chum_inplace(df.copy(), col)
ret_elpas = move_to_front_elpastor(df.copy(), col)
ret_sach = move_to_front_sachinmm(df.copy(), col)
ret_city = move_to_front_citynorman_inplace(df.copy(), col)

# Assert equivalence of solutions.
assert(ret_mine.equals(ret_chum1))
assert(ret_mine.equals(ret_chum2))
assert(ret_mine.equals(ret_elpas))
assert(ret_mine.equals(ret_sach))
assert(ret_mine.equals(ret_city))

ফলাফল :

# For n_cols = 11:
%timeit test(move_to_front_normanius_inplace, df)
# 1.05 ms ± 42.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit test(move_to_front_citynorman_inplace, df)
# 1.68 ms ± 46.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%timeit test(move_to_front_sachinmm, df)
# 3.24 ms ± 96.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test(move_to_front_chum, df)
# 3.84 ms ± 114 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test(move_to_front_elpastor, df)
# 3.85 ms ± 58.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test(move_to_front_chum_inplace, df)
# 9.67 ms ± 101 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)


# For n_cols = 31:
%timeit test(move_to_front_normanius_inplace, df)
# 1.26 ms ± 31.6 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test(move_to_front_citynorman_inplace, df)
# 1.95 ms ± 260 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test(move_to_front_sachinmm, df)
# 10.7 ms ± 348 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test(move_to_front_chum, df)
# 11.5 ms ± 869 µs per loop (mean ± std. dev. of 7 runs, 100 loops each
%timeit test(move_to_front_elpastor, df)
# 11.4 ms ± 598 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit test(move_to_front_chum_inplace, df)
# 31.4 ms ± 1.89 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

4
দুর্দান্ত সমাধান। যাইহোক, আমাদের স্পষ্টভাবে মূল df lyোকানো কলামের সাথে পরিবর্তিত df বরাদ্দ করা উচিত নয়। পরিবর্তে df = df.insert(0, col.name, col), আমাদের করা প্রয়োজন df.insert(0, col.name, col)। আপনি move_column_inplace()যদিও এটি সঠিকভাবে আছে ।
মেলিহোজবাক

4
ধন্যবাদ @ নরম্যানিয়াস ডেক্সটরের ল্যাবরেটরিতে আমি কঠোর পরিশ্রম করেছি। :-) দুর্দান্ত সমাধান। ওকামের রেজার। সহজ এবং মার্জিত।
ব্রহজও

আমি এই সমাধানটিও পছন্দ করি :)
ব্যবহারকারী 88484

18

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

df = df.set_index('Mid').reset_index()


এটি ব্যবহার করে যে বর্তমান সংস্করণগুলি reset_index()প্রথম অবস্থানে ফেলে দেওয়া সূচিটি সন্নিবেশ করায়। নোট করুন, তবে, এই আচরণটি ডক্সে নির্দিষ্ট করা হয়নি ।
নরম্যানিয়াস

4
অভিনয় হিসাবে, আমার উত্তর দেখুন। এটা ব্যবহার করা সুবিধাজনক এর inplace=Trueউভয়ের জন্য set_index()এবং reset_index()
নরম্যানিয়াস

9

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

cols = df.columns.tolist()
n = int(cols.index('Mid'))
cols = [cols[n]] + cols[:n] + cols[n+1:]
df = df[cols]

4
আদর্শভাবে, আপনার উত্তরটি ব্যাখ্যা করুন এবং কী এটি একটি ভাল সমাধান করে তোলে, এবং কেবল কোডের একটি অংশ পোস্ট করে না। আপনি নিম্নচোটকে ঝুঁকিপূর্ণ করছেন
Tjebo

5

কোনও ডাটাফ্রেমের সারিগুলিকে পুনরায় অর্ডার করতে নীচে কেবল একটি তালিকা ব্যবহার করুন।

df = df[['Mid', 'Net', 'Upper', 'Lower', 'Zsore']]

পরে কোডটি পড়ার সময় এটি কী হয়েছিল তা এটি খুব স্পষ্ট করে তোলে। এছাড়াও ব্যবহার করুন:

df.columns
Out[1]: Index(['Net', 'Upper', 'Lower', 'Mid', 'Zsore'], dtype='object')

তারপরে কেটে পেস্ট করে পুনরায় অর্ডার করুন।


অনেকগুলি কলাম সহ ডেটাফ্রেমের জন্য কলামগুলির তালিকাটি একটি ভেরিয়েবলের মধ্যে সংরক্ষণ করুন এবং পছন্দসই কলামটিকে তালিকার সামনের দিকে পপ করুন। এখানে একটি উদাহরণ:

cols = [str(col_name) for col_name in range(1001)]
data = np.random.rand(10,1001)
df = pd.DataFrame(data=data, columns=cols)

mv_col = cols.pop(cols.index('77'))
df = df[[mv_col] + cols]

এখন df.columnsআছে।

Index(['77', '0', '1', '2', '3', '4', '5', '6', '7', '8',
       ...
       '991', '992', '993', '994', '995', '996', '997', '998', '999', '1000'],
      dtype='object', length=1001)

আপনি যদি 1001 কলামযুক্ত ডেটাফ্রেম নিয়ে কাজ করেন?
নরম্যানিয়াস

ধারণাটি একই, তবে অনেক কলামের সাথে কলামগুলি একটি তালিকায় সংরক্ষণ করা উচিত এবং তালিকাটি ম্যানিপুলেট করা উচিত। উদাহরণস্বরূপ উপরে আমার সম্পাদনাগুলি দেখুন। আমার উদাহরণ কার্যকরভাবে স্ট্যাকওভারফ্লো . com/a/51009742/5827921 এর মতো
ডাস্টিন হেলভিওয়েল

1

এখানে এটি একটি খুব সহজ উত্তর।

কলামের নামের চারপাশে দুটি (()) 'বন্ধনী' ভুলে যাবেন না ther অন্যদিকে, এটি আপনাকে একটি ত্রুটি দেবে।


# here you can add below line and it should work 
df = df[list(('Mid','Upper', 'Lower', 'Net','Zsore'))]
df

                             Mid   Upper   Lower  Net  Zsore
Answer option                                                
More than once a day          2   0.22%  -0.12%   0%    65 
Once a day                    3   0.32%  -0.19%   0%    45
Several times a week          4   2.45%   1.10%   2%    78
Once a week                   6   1.63%  -0.40%   1%    65

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

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