পান্ডায় নির্দিষ্ট কলাম (গুলি) এর নতুন নাম দিন


182

আমি একটি ডেটাফ্রেম পেয়েছি data। আমি কীভাবে একমাত্র কলামের শিরোনামটির নাম পরিবর্তন করব? উদাহরণস্বরূপ gdpকরার log(gdp)?

data =
    y  gdp  cap
0   1    2    5
1   2    3    9
2   8    7    2
3   3    4    7
4   6    7    7
5   4    8    3
6   8    2    8
7   9    9   10
8   6    6    4
9  10   10    7

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

উত্তর:


360
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)

renameশো এটির জন্য একটি PARAM হিসাবে একটি অভি গ্রহণ columnsযাতে আপনি শুধু একটি একক এন্ট্রি সঙ্গে একটি অভি পাস।

আরো দেখুন সংশ্লিষ্ট


3
এটি একটি বড় ডেটাফ্রেমে খুব দীর্ঘ সময় নেয়, তাই আমি বিশ্বাস করি এটি মেমোরিতে পুরো ডেটা ফ্রেমটি কোনওভাবে অনুলিপি করে?
এলজেহেলজ

1
@ ইলহেলিজ এটি করা উচিত নয়, বেশিরভাগ পান্ডাস অপারেশন একটি অনুলিপি ফিরিয়ে দেবে এবং কেউ কেউ পরমকে গ্রহণ inplaceকরবে, যদি এটি এই পরমটিকে উপেক্ষা করে থাকে তবে এটি একটি বাগ, আপনি পরমকে সাথে এবং ছাড়া সময় নির্ধারণ করতে পারেন, এই জাতীয় কিছু চেষ্টা করে new_df = df.rename(columns={'new_name':'old_name'})দেখুন এবং দেখুন যে এটি দ্রুত বা না
এডচুম

1
@ এডচাম ধন্যবাদ পরম সরিয়ে ফেলা inplaceপ্রায় 14 সেকেন্ড থেকে 26 সেকেন্ডে সময় দ্বিগুণ করে। তবে 14 সেকেন্ড এখনও বেশ দীর্ঘ সময় কেবলমাত্র শিরোনাম বদলানোর জন্য ..
এলিজেলজ

2
শুধু একটি নোট, সাবধান! যদি লক্ষ্য কলামটি না থাকে, (নামের ভুল বানান বা তাই) এটি ত্রুটি বা সতর্কতা সহ কিছুই করবে না।
আমির

1
@ কিস্টিটি এটি হতাশাজনক যে কেন এই তালিকাটি বোঝার মাধ্যমে কিছু সাধারণ অপসকে কেবল দ্রুত করা হয়। মৌলিকভাবে যদিও আপনার যদি খুব বড় ডিএফ না থাকে তবে আপনি যদি বড় ডিএফ-তে প্রচুর কলামের নাম পরিবর্তন না করে থাকেন তবে তা আসলেই
বিবেচ্য নয়

27

list-comprehensionআপনার যদি একটি একক কলামের নতুন নামকরণের প্রয়োজন হয় তবে আরও দ্রুত বাস্তবায়ন হ'ল।

df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]

যদি একাধিক কলামের নাম পরিবর্তনের প্রয়োজন দেখা দেয় তবে হয় শর্তসাপেক্ষ এক্সপ্রেশনগুলি ব্যবহার করুন:

df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]

বা, একটি ব্যবহার করে একটি ম্যাপিং তৈরি করুন dictionaryএবং পুরানো নাম হিসাবে ডিফল্ট মান সেট list-comprehensionকরে এর getক্রিয়াকলাপটি সম্পাদন করুন :

col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'}   ## key→old name, value→new name

df.columns = [col_dict.get(x, x) for x in df.columns]

সময়:

%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop

%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop

আমি এই পদ্ধতি ব্যবহার করতে চাই, কিন্তু দুর্ভাগ্যবশত এটা কাজ করে না pd.merge_asof(), কারণ এটি একটি অভিব্যক্তি :( আছে।
thdoan

14

পান্ডাতে আমি কীভাবে একটি নির্দিষ্ট কলামটির নাম পরিবর্তন করব?

V0.24 + থেকে একবারে এক (বা আরও) কলামগুলির নাম পরিবর্তন করতে,

  • DataFrame.rename()সহ axis=1বা axis='columns'( axisযুক্তিটি চালু হয়েছিল v0.21

  • Index.str.replace() স্ট্রিং / রেজেক্স ভিত্তিক প্রতিস্থাপনের জন্য।

আপনার যদি একবারে সমস্ত কলামগুলির নাম পরিবর্তন করতে হয়,

  • DataFrame.set_axis()পদ্ধতি সহ axis=1। একটি তালিকা মত ক্রম পাস। বিকল্পগুলি পাশাপাশি স্থান পরিবর্তনের জন্য উপলব্ধ।

rename সঙ্গে axis=1

df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df

   y gdp cap
0  x   x   x
1  x   x   x
2  x   x   x
3  x   x   x
4  x   x   x

0.21+ দিয়ে আপনি এখন এর axisসাথে একটি পরামিতি নির্দিষ্ট করতে পারবেন rename:

df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
    
   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

(দ্রষ্টব্য যে renameডিফল্টরূপে স্থানে নেই, সুতরাং আপনাকে ফলাফলটি পুনরায় বরাদ্দ করতে হবে ))

এপিআইয়ের বাকি অংশগুলির সাথে ধারাবাহিকতা উন্নত করতে এই সংযোজন করা হয়েছে। নতুন axisযুক্তিটি columnsপ্যারামিটারের সাথে সাদৃশ্যপূর্ণ — তারা একই কাজ করে।

df.rename(columns={'gdp': 'log(gdp)'})

   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

rename এছাড়াও প্রতিটি কলিমে একবার কল করা কলব্যাক গ্রহণ করে।

df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')

   y  g  c
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x
4  x  x  x

এই নির্দিষ্ট দৃশ্যের জন্য, আপনি ব্যবহার করতে চান

df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)

Index.str.replace

replaceপাইথনের স্ট্রিং পদ্ধতির অনুরূপ , পান্ডাস সূচক এবং সিরিজ (কেবলমাত্র বস্তু টাইপ) str.replaceস্ট্রিং এবং রেজেক্স-ভিত্তিক প্রতিস্থাপনের জন্য একটি ("ভেক্টরাইজড") পদ্ধতি সংজ্ঞায়িত করে ।

df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
 
   y log(gdp) cap
0  x        x   x
1  x        x   x
2  x        x   x
3  x        x   x
4  x        x   x

অন্যান্য পদ্ধতির মাধ্যমে এর সুবিধাটি হ'ল str.replaceরেজেক্স (ডিফল্টরূপে সক্ষম) সমর্থন করে। আরও তথ্যের জন্য ডক্স দেখুন।


set_axisসাথে একটি তালিকা পাসaxis=1

set_axisশিরোনামের তালিকা সহ কল করুন । তালিকাটি কলাম / সূচক আকারের দৈর্ঘ্যে সমান হতে হবে। set_axisমূল ডেটাফ্রেমকে ডিফল্টরূপে রূপান্তর করে তবে আপনি inplace=Falseপরিবর্তিত অনুলিপিটি নির্দিষ্ট করতে পারেন।

df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)

  cap log(gdp)  y
0   x        x  x
1   x        x  x
2   x        x  x
3   x        x  x
4   x        x  x

দ্রষ্টব্য: ভবিষ্যতে প্রকাশে, inplaceডিফল্ট হবে True

পদ্ধতি শৃঙ্খলা যখন আমাদের কাছে ইতিমধ্যে কলামগুলি বরাদ্দ করার দক্ষ পদ্ধতি রয়েছে তখন
কেন নির্বাচন set_axisকরবেন df.columns = ...? [এই উত্তর] তে টেড পেত্রো দেখিয়েছেন, ( https://stackoverflow.com/a/46912050/4909087 )set_axis পদ্ধতিগুলি শৃঙ্খলাবদ্ধ করার চেষ্টা করার সময় দরকারী।

তুলনা করা

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

বনাম

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

পূর্ববর্তীটি আরও প্রাকৃতিক এবং নিখরচায় প্রবাহিত বাক্য গঠন।


3

পান্ডায় নির্দিষ্ট কলামগুলির নাম পরিবর্তন করার জন্য কমপক্ষে পাঁচটি ভিন্ন উপায় রয়েছে এবং আমি আসল উত্তরের লিঙ্কগুলির সাথে তাদের নীচে তালিকাভুক্ত করেছি। আমি এই পদ্ধতিগুলিও টাইম করেছিলাম এবং সেগুলি সম্পর্কে একইগুলি সম্পাদন করতে দেখতে পেয়েছি (যদিও আপনার ডেটা সেট এবং দৃশ্যের উপর নির্ভর করে ওয়াইএমএমভি)। নিচে পরীক্ষা ক্ষেত্রে কলাম নামান্তর হয় A M N Zথেকে A2 M2 N2 Z2কলাম সহ একটি dataframe মধ্যে Aথেকে Zএকটি মিলিয়ন সারি রয়েছে।

# Import required modules
import numpy as np
import pandas as pd
import timeit

# Create sample data
df = pd.DataFrame(np.random.randint(0,9999,size=(1000000, 26)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))

# Standard way - https://stackoverflow.com/a/19758398/452587
def method_1():
    df_renamed = df.rename(columns={'A': 'A2', 'M': 'M2', 'N': 'N2', 'Z': 'Z2'})

# Lambda function - https://stackoverflow.com/a/16770353/452587
def method_2():
    df_renamed = df.rename(columns=lambda x: x + '2' if x in ['A', 'M', 'N', 'Z'] else x)

# Mapping function - https://stackoverflow.com/a/19758398/452587
def rename_some(x):
    if x=='A' or x=='M' or x=='N' or x=='Z':
        return x + '2'
    return x
def method_3():
    df_renamed = df.rename(columns=rename_some)

# Dictionary comprehension - https://stackoverflow.com/a/58143182/452587
def method_4():
    df_renamed = df.rename(columns={col: col + '2' for col in df.columns[
        np.asarray([i for i, col in enumerate(df.columns) if 'A' in col or 'M' in col or 'N' in col or 'Z' in col])
    ]})

# Dictionary comprehension - https://stackoverflow.com/a/38101084/452587
def method_5():
    df_renamed = df.rename(columns=dict(zip(df[['A', 'M', 'N', 'Z']], ['A2', 'M2', 'N2', 'Z2'])))

print('Method 1:', timeit.timeit(method_1, number=10))
print('Method 2:', timeit.timeit(method_2, number=10))
print('Method 3:', timeit.timeit(method_3, number=10))
print('Method 4:', timeit.timeit(method_4, number=10))
print('Method 5:', timeit.timeit(method_5, number=10))

আউটপুট:

Method 1: 3.650640267
Method 2: 3.163998427
Method 3: 2.998530871
Method 4: 2.9918436889999995
Method 5: 3.2436501520000007

আপনার কাছে সবচেয়ে স্বজ্ঞাত এবং আপনার প্রয়োগে প্রয়োগের পক্ষে সবচেয়ে সহজ পদ্ধতিটি ব্যবহার করুন।

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