পান্ডায় কলামের নামকরণ


1822

আমার কাছে প্যান্ডাস এবং কলাম লেবেল ব্যবহার করে একটি ডেটাফ্রেম রয়েছে যা মূল কলাম লেবেলগুলি প্রতিস্থাপনের জন্য আমাকে সম্পাদনা করতে হবে।

আমি Aযেখানে মূল কলামের নাম সেখানে ডেটা ফ্রেমে কলামের নামগুলি পরিবর্তন করতে চাই :

['$a', '$b', '$c', '$d', '$e'] 

প্রতি

['a', 'b', 'c', 'd', 'e'].

আমার সম্পাদিত কলামের নামগুলি এটি একটি তালিকায় সঞ্চিত আছে, তবে কলামের নামগুলি কীভাবে প্রতিস্থাপন করা যায় তা আমি জানি না।


1
আপনি যে অফিশিয়াল ডক্সটি
ccpizza

উত্তর:


1825

কেবল এটিকে .columnsবৈশিষ্ট্যে নির্ধারণ করুন :

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

302
একক কলামের শিরোনামের নাম পরিবর্তন করা কি সম্ভব?
এরিকমজল

112
@ এরিকমজল: ধরুন আপনি ডিএফের প্রথম ভেরিয়েবলের নাম পরিবর্তন করতে চান। তারপরে আপনি এমন কিছু করতে পারেন:new_columns = df.columns.values; new_columns[0] = 'XX'; df.columns = new_columns
cd98

54
দেখে মনে হচ্ছে আপনি কেবল df.columns.values ​​[0] = 'XX'
RAY

25
খালি মজা করছেন, @ রায়ে - এটি করবেন না। দেখে মনে হচ্ছে যে কলামের নাম সূচিবদ্ধ করে যা কিছু থাকে তা ছাড়াই স্বাধীনভাবে তৈরি একটি তালিকা। আপনার ডিএফের নামকরণের কলামটি ধ্বংস করার জন্য কি একটি দুর্দান্ত কাজ রয়েছে ...
মিচ ফ্ল্যাক্স

433
@ এরিকমজল হ্যাঁdf.rename(columns = {'$b':'B'}, inplace = True)
নাচোকাব

2841

পুনরায় নামকরণ করুন নির্দিষ্ট কলম্বস

df.rename()ফাংশনটি ব্যবহার করুন এবং কলামগুলি পুনরায় নামকরণের জন্য উল্লেখ করুন। সমস্ত কলামের নতুন নামকরণ করতে হবে না:

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

ন্যূনতম কোড উদাহরণ

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

নিম্নলিখিত পদ্ধতিগুলি সমস্ত কাজ করে এবং একই আউটপুট উত্পাদন করে:

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)  # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'})  # old method  

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

পরিবর্তনটি অন্তর্ভুক্ত না হওয়ায় ফলাফলটি পুনরায় বরাদ্দ করতে ভুলবেন না। বিকল্পভাবে, নির্দিষ্ট করুন inplace=True:

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

V0.25 থেকে, আপনি errors='raise'যদি কোনও অবৈধ কলাম-থেকে- পুনর্নবীকরণ নির্দিষ্ট করে থাকে তবে ত্রুটি বাড়াতেও নির্দিষ্ট করতে পারেন। V0.25 rename()ডক্স দেখুন ।


পুনরায় কলিং শিরোনাম

ব্যবহার করুন df.set_axis()সঙ্গে axis=1এবং inplace=False(একটি কপি ফিরতে)।

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

এটি একটি অনুলিপি প্রদান করে, তবে আপনি সেট করে ডেটাফ্রেমকে ইন-প্লেসে সংশোধন করতে পারবেন inplace=True(এটি সংস্করণ <= 0.24 এর জন্য ডিফল্ট আচরণ তবে ভবিষ্যতে পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে)।

আপনি সরাসরি শিরোনাম নিযুক্ত করতে পারেন:

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

2
আমি যখন 6 টি কলামের ডেটা ফ্রেম দিয়ে এটি করি (ডেটাফ্রেম <টিপুন> চাপুন) সংক্ষিপ্ত উপস্থাপনা: code<বর্গ 'pandas.core.frame.DataFrame'> Int64Index: 1000 এন্ট্রি, 0 থেকে 999 ডেটা কলাম: বডিমারকডাউন 1000 নন-নাল codeওয়ার্কস , কিন্তু যখন আমি ডেটাফ্রেম করি (হেড) করি তখন কলামগুলির পুরানো নামগুলি আবার উপস্থিত হবে।
darKoram

12
আমি SettingWithCopyWarning:যখন এই উত্তরে দ্বিতীয় কোড স্নিপেট ব্যবহার করি তখন আমি আতঙ্কিত হই।
মনিকা হেডনেক

রেজেক্স রিপ্লেসমেন্টের সাথে এর কোনও সংস্করণ আছে কি?
denfromufa

@ অধ্যক্ষ যদি দুটি বিদ্যমান কলামের একই নাম হয়? আমি কীভাবে পুরানো কলামের নাম উল্লেখ করব?
ভবঘুরে

14
প্রথম সমাধান: df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})প্রদর্শিত নাম পরিবর্তন করে তবে অন্তর্নিহিত ডেটা কাঠামোতে উপাদান নয় । সুতরাং আপনি চেষ্টা করলে আপনি df['newName1']একটি ত্রুটি পাবেন। inplace=Trueযে gotchya এড়াতে প্রয়োজন।
irritable_phd_syndrom

402

renameপদ্ধতি গ্রহণ করতে পারেন ফাংশন উদাহরণস্বরূপ:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

56
খুশী হলাম। এইটি আমার দিনটি বাঁচিয়েছিল:df.rename(columns=lambda x: x.lstrip(), inplace=True)
রুট-11

2
@ রুট -11 এর অনুরূপ - আমার ক্ষেত্রে একটি বুলেট পয়েন্ট চরিত্র ছিল যা আইপিথন কনসোল আউটপুটে মুদ্রিত হয়নি, সুতরাং আমাকে কেবল শ্বেত স্পেস (স্ট্রাইপ) এর চেয়ে বেশি সরিয়ে ফেলতে হবে, সুতরাং:t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
রেড

9
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)একটি মণি যাতে আমরা লেখার df.Column_1_Nameপরিবর্তে লিখতে পারি df.loc[:, 'Column 1 Name']
লিটল ববি টেবিল


163

পান্ডাস 0.21+ উত্তর

সংস্করণ ০.২১-এ পুনরায় নামকরণের জন্য কয়েকটি উল্লেখযোগ্য আপডেট রয়েছে updates

  • renameপদ্ধতি যোগ করেনি axisপ্যারামিটার যা সেট করা হতে পারে columnsবা 1। এই আপডেটটি এই পদ্ধতিটিকে বাকি পান্ডাস এপিআইয়ের সাথে মেলে। এটি এখনও indexএবং আছেcolumns পরামিতি কিন্তু আপনি আর তাদের ব্যবহার করতে বাধ্য হয়।
  • set_axisপদ্ধতি সঙ্গে inplaceসেটে Falseআপনি একটি তালিকা সঙ্গে সব সূচক বা কলাম লেবেল নামান্তর করতে দেয়।

পান্ডাস 0.21+ এর উদাহরণ

নমুনা ডেটা ফ্রেম তৈরি করুন:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

renameসঙ্গে axis='columns'বা ব্যবহার করেaxis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

অথবা

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

উভয় নিম্নলিখিত ফলাফল:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

পুরানো পদ্ধতির স্বাক্ষরটি ব্যবহার করা এখনও সম্ভব:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

renameফাংশন এছাড়াও ফাংশন প্রতিটি কলামের নামের প্রয়োগ করা হবে স্বীকার করে।

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

অথবা

df.rename(lambda x: x[1:], axis=1)

set_axisএকটি তালিকা এবং ব্যবহার করেinplace=False

আপনি সেই set_axisপদ্ধতিতে একটি তালিকা সরবরাহ করতে পারেন যা কলামের সংখ্যার (বা সূচক) এর সমান দৈর্ঘ্য। বর্তমানে inplaceডিফল্ট True, তবে ভবিষ্যতে inplaceপ্রকাশে ডিফল্ট হবে False

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

অথবা

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

কেন ব্যবহার df.columns = ['a', 'b', 'c', 'd', 'e']করবেন না ?

সরাসরি কলামগুলি বরাদ্দ করার ক্ষেত্রে কোনও সমস্যা নেই। এটি একটি পুরোপুরি ভাল সমাধান।

ব্যবহারের সুবিধা 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()

1
আপনাকে ধন্যবাদ Pandas 0.21+ answer- কোনওভাবে আমি "নতুন কী" অংশে সেই অংশটি মিস করেছি ...
ম্যাকসু

1
সমাধান পান্ডাদের 3.6: df.rename ({'$ a': 'a', '$ বি': 'বি', '$ সি': 'সি', '$ ডি': 'ডি'র জন্য কাজ করছে বলে মনে হচ্ছে না ',' $ ই ':' ই '}, অক্ষ =' কলাম ')। একটি অপ্রত্যাশিত শব্দ যুক্তি "অক্ষ" পায়
আর্থার ডি Howland

3
df.columns = ['a', 'b', 'c', 'd', 'e'] এখন আর কাজ করবে না বলে মনে হয়, সংস্করণ 0.22 নিয়ে কাজ করে আমার একটি সতর্কতা রয়েছে যে পান্ডারা কলামগুলি এর মাধ্যমে তৈরি করতে দেয় না " একটি নতুন বৈশিষ্ট্য নাম । আমার সমস্ত কলামগুলিকে একই বলা হলে কীভাবে নাম পরিবর্তন করবেন: /
নাবলা

আপনি যদি কলাম (গুলি) এর নাম আগে জানতেন না তবে কেবল তাদের সূচকটি না জানলে কোনও একাধিক বা সমস্ত কলামের নতুন নামকরণের কি উপায় আছে? ধন্যবাদ!
tommy.carstensen

এটি একটি খুব সহায়ক মন্তব্য ছিল। উদাহরণস্বরূপ, ল্যাম্বডা ফাংশনটি নিম্নলিখিতগুলি কীভাবে করবেন সে সম্পর্কে আমার প্রশ্নের জবাব দিয়েছে:(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
ম্যাসাথেলথিংস

131

যেহেতু আপনি কেবল সমস্ত কলামের নামগুলিতে $ সাইনটি সরাতে চান, আপনি কেবল এটি করতে পারেন:

df = df.rename(columns=lambda x: x.replace('$', ''))

অথবা

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

1
এটি কেবল ওপি-র ক্ষেত্রেই নয়, সাধারণ প্রয়োজনেও সহায়তা করে। উদাহরণস্বরূপ: একটি কলামের নাম পৃথককারী দ্বারা বিভক্ত করতে এবং এর একটি অংশ ব্যবহার করতে।
দীপক

76
df.columns = ['a', 'b', 'c', 'd', 'e']

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


5
সংশোধন করবেন না df.columns.values, এটি ভুল। stackoverflow.com/questions/43291781/...
llllllllll

61
old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

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


1
আমি এই পদ্ধতির পছন্দ করি, তবে আমি মনে করি df.columns = ['a', 'b', 'c', 'd', 'e']এটি সহজ।
ক্রিস্টোফার পিয়ারসন

1
পুরানো এবং নতুন নামগুলি জিপ করার এই পদ্ধতিটি আমার পছন্দ। আমরা df.columns.valuesপুরানো নামগুলি পেতে ব্যবহার করতে পারি।
বিকাউশিক

1
আমি সারণী দর্শনটি প্রদর্শন করি এবং কলামগুলি পুরানো_নামগুলিতে অনুলিপি করি। আমি প্রয়োজনীয় অ্যারেটিকে নতুন নামগুলিতে অনুলিপি করি। তারপরে ডিকটি ব্যবহার করুন (জিপ (পুরানো নাম, নতুন_নাম)) খুব মার্জিত সমাধান solution
mythicalcoder

আমি প্রায়শই: myList = list(df) myList[10:20]ইত্যাদি ইত্যাদি থেকে তালিকার সাবসেট ব্যবহার করি - সুতরাং এটি নিখুঁত।
টিম গটগেটেরু

@ বোকউশিকের পরামর্শ অনুসারে পুরানো নামগুলি নেওয়া ভাল, তারপরে সেগুলি সম্পাদনা করুন এবং সেগুলি পুনরায় সন্নিবেশ করুন namez = df.columns.values, তারপরে কিছু সম্পাদনা অনুসরণ করুন df.columns = namez
পলজোহন 32

34

এক লাইন বা পাইপলাইন সমাধান

আমি দুটি বিষয়ে মনোনিবেশ করব:

  1. ওপি স্পষ্টভাবে বলেছে

    আমার সম্পাদিত কলামের নামগুলি এটি একটি তালিকায় সঞ্চিত আছে, তবে কলামের নামগুলি কীভাবে প্রতিস্থাপন করা যায় তা আমি জানি না।

    আমি '$'প্রতিটি কলামের শিরোনামের প্রথম অক্ষরটি কীভাবে প্রতিস্থাপন করতে বা ফেলা করতে পারি তার সমস্যাটি সমাধান করতে চাই না । ওপি ইতিমধ্যে এই পদক্ষেপটি করেছে। পরিবর্তে আমি বিদ্যমান columnsঅবজেক্টটি প্রতিস্থাপন কলামের নামের একটি তালিকা দিয়ে একটি নতুন দিয়ে প্রতিস্থাপনের দিকে মনোনিবেশ করতে চাই ।

  2. df.columns = newnewনতুন কলামের নামের তালিকাটি যেখানে পাওয়া যায় তত সহজ। এই পদ্ধতির অপূর্ণতা হ'ল এটির জন্য বিদ্যমান ডাটাফ্রেমের columnsবৈশিষ্ট্য সম্পাদনা প্রয়োজন এবং এটি ইনলাইন করা হয়নি। বিদ্যমান ডাটাফ্রেমটি সম্পাদনা না করে পাইপলাইনের মাধ্যমে এটি সম্পাদনের কয়েকটি উপায় আমি দেখাব show


সেটআপ 1
পূর্ব-বিদ্যমান তালিকার dfসাথে কলামের নামগুলি পুনঃস্থাপনের প্রয়োজনের দিকে মনোনিবেশ করতে, আমি প্রাথমিক কলামের নাম এবং সম্পর্কিত নয় নতুন কলামের নাম সহ একটি নতুন নমুনা ডেটাফ্রেম তৈরি করব ।

df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']

df

   Jack  Mahesh  Xin
0     1       3    5
1     2       4    6

সমাধান ঘ
pd.DataFrame.rename

এটি ইতিমধ্যে বলা হয়েছে যে আপনার যদি পুরানো কলামের নামগুলিকে নতুন কলামের নামগুলিতে ম্যাপিং করতে একটি অভিধান থাকে তবে আপনি ব্যবহার করতে পারেন pd.DataFrame.rename

d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)

   x098  y765  z432
0     1     3     5
1     2     4     6

তবে আপনি সহজেই সেই অভিধানটি তৈরি করতে এবং কলটিতে অন্তর্ভুক্ত করতে পারেন rename। নিম্নলিখিতটি dfপুনরুক্তি করার সময় , আমরা প্রতিটি কলামের নামটি দিয়ে পুনরাবৃত্তি করি advantage

# given just a list of new column names
df.rename(columns=dict(zip(df, new)))

   x098  y765  z432
0     1     3     5
1     2     4     6

আপনার মূল কলামের নামগুলি অনন্য হলে এটি দুর্দান্ত কাজ করে। তবে যদি তারা না হয়, তবে এটি ভেঙে যায়।


2
অ-অনন্য কলাম সেটআপ করুন

df = pd.DataFrame(
    [[1, 3, 5], [2, 4, 6]],
    columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']

df

   Mahesh  Mahesh  Xin
0       1       3    5
1       2       4    6

সমাধান 2
pd.concat ব্যবহার করেkeysযুক্তিটি

প্রথমে লক্ষ্য করুন যে যখন সমাধান 1:

df.rename(columns=dict(zip(df, new)))

   y765  y765  z432
0     1     3     5
1     2     4     6

আমরা newকলামের নাম হিসাবে তালিকাটি ম্যাপ করি নি । আমরা পুনরাবৃত্তি শেষ y765। পরিবর্তে, আমরা কলামগুলির পুনরাবৃত্তির সময় ফাংশনের keysযুক্তিটি ব্যবহার করতে পারি ।pd.concatdf

pd.concat([c for _, c in df.items()], axis=1, keys=new) 

   x098  y765  z432
0     1     3     5
1     2     4     6

সমাধান 3
পুনর্গঠন। আপনার যদি dtypeসমস্ত কলামের জন্য একটি একক থাকে তবে এটি ব্যবহার করা উচিত । অন্যথায়, আপনি dtype objectসমস্ত কলামের সমাপ্তি এবং এগুলিকে আবার রূপান্তর করতে আরও অভিধানের কাজ প্রয়োজন।

একক dtype

pd.DataFrame(df.values, df.index, new)

   x098  y765  z432
0     1     3     5
1     2     4     6

মিশ্র dtype

pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

সমাধান 4
এটি transposeএবং এর সাথে একটি চতুর কৌশল set_indexpd.DataFrame.set_indexআমাদের একটি সূচি ইনলাইন সেট করতে দেয় তবে এর সাথে কোনও মিল নেই set_columns। সুতরাং আমরা আবার স্থানান্তর করতে set_indexএবং ফিরে স্থানান্তর করতে পারি । তবে একই একক dtypeবনাম মিশ্রিতdtype সমাধান 3 থেকে ক্যাভ্যাট এখানে প্রয়োগ হয় app

একক dtype

df.T.set_index(np.asarray(new)).T

   x098  y765  z432
0     1     3     5
1     2     4     6

মিশ্র dtype

df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

সমাধান 5
ব্যবহারের একটি lambdaমধ্যে pd.DataFrame.renameপ্রতিটি উপাদান মাধ্যমে চক্র new
এই সমাধান, আমরা একটি ল্যামডা যে লাগে পাস xকিন্তু তারপর, এটা উপেক্ষা করে। এটি একটি লাগে yকিন্তু এটি আশা করে না। পরিবর্তে, একটি পুনরাবৃত্তিকে ডিফল্ট মান হিসাবে দেওয়া হয় এবং আমি তার মানটি কী তা বিবেচনা না করেই একবারে এটির মাধ্যমে চক্রটি ব্যবহার করতে পারি x

df.rename(columns=lambda x, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

এবং সোপাইথন চ্যাটের লোকেরা আমাকে যেভাবে নির্দেশ করেছে , যদি আমি *এর মধ্যে একটি যোগ করি xএবং y, আমি আমার yপরিবর্তনশীলটিকে রক্ষা করতে পারি । যদিও, এই প্রসঙ্গে আমি বিশ্বাস করি না যে এটির সুরক্ষা প্রয়োজন। এটি এখনও উল্লেখ করার মতো।

df.rename(columns=lambda x, *, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

সম্ভবত আমরা যুক্ত করতে পারিdf.rename(lambda x : x.lstrip('$'),axis=1)
YOBEN_S

হাই @ পিআইআরস্কয়ার্ড, আপনি কীভাবে পান্ডস সলিউশন 5-এ ল্যাম্বডা ফাংশনটি ব্যবহার করবেন তা বিস্তারিতভাবে জানাতে সক্ষম হবেন? আপনি যখন xঅগ্রাহ্য করবেন তখন আপনি যা বলতে চাইছেন তা আমি পুরোপুরি অনুসরণ করি না ?
জোসমুর98

33

কলামের নাম বনাম নাম সিরিজ

পর্দার আড়ালে কী ঘটেছিল তা আমি কিছুটা ব্যাখ্যা করতে চাই।

ডেটাফ্রেমগুলি সিরিজের একটি সেট।

পরিবর্তে সিরিজ একটি এর এক্সটেনশন numpy.array

numpy.arrays একটি সম্পত্তি আছে .name

এই সিরিজের নাম। এটি খুব কমই যে পান্ডারা এই বৈশিষ্ট্যটিকে সম্মান করে তবে এটি স্থানে থাকে এবং কিছু পান্ডাস আচরণ হ্যাক করতে ব্যবহার করা যেতে পারে।

কলামের তালিকার নামকরণ

এখানে প্রচুর উত্তর df.columnsবৈশিষ্ট্যটি সম্পর্কে listযখন কথা হয় তখন এটি আসলে একটি Series। এর অর্থ এটির একটি .nameবৈশিষ্ট্য রয়েছে।

আপনি যদি কলামগুলির নাম পূরণ করার সিদ্ধান্ত নেন তবে এটি ঘটে Series:

df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index       
0                                    4           1
1                                    5           2
2                                    6           3

নোট করুন যে সূচকের নাম সর্বদা একটি কলাম নীচে আসে।

আর্টিফেক্টস যে দীর্ঘায়িত

.nameঅ্যাট্রিবিউট কখনও কখনও উপর lingers। আপনি যদি সেট করেন df.columns = ['one', 'two']তবে তা df.one.nameহবে'one'

যদি আপনি সেট করেন df.one.name = 'three'তবে df.columnsএখনও আপনাকে দেবেন ['one', 'two'], এবং df.one.nameআপনাকে দেবেন'three'

কিন্তু

pd.DataFrame(df.one) ফিরে আসবে

    three
0       1
1       2
2       3

কারণ পান্ডাস .nameইতিমধ্যে সংজ্ঞায়িতগুলির পুনরায় ব্যবহার করে Series

একাধিক স্তরের কলামের নাম

পান্ডাদের বহু স্তরের কলামের নাম করার উপায় রয়েছে। এত জাদু জড়িত নেই তবে আমি আমার উত্তরটিতে এটি আবরণ করতে চেয়েছিলাম যেহেতু আমি এখানে কেউ এড়াতে দেখছি না।

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

তালিকার উপরে কলাম সেট করে এটি সহজেই অর্জনযোগ্য:

df.columns = [['one', 'one'], ['one', 'two']]

18

যদি আপনি ডেটাফ্রেম পেয়ে থাকেন তবে df.colमগুলি হেরফের করতে পারে এমন একটি তালিকায় সমস্ত কিছু ফেলে দেয় এবং তারপরে কলামগুলির নাম হিসাবে আপনার ডেটাফ্রেমে পুনরায় সাইন ইন করুন ...

columns = df.columns
columns = [row.replace("$","") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() #to validate the output

সবচেয়ে ভালো উপায়? Idk। একটি উপায় - হ্যাঁ

প্রশ্নের উত্তরে এগিয়ে দেওয়া সমস্ত মূল কৌশলগুলি মূল্যায়নের একটি ভাল উপায় নীচে সিপ্রোফাইল ব্যবহার করে মেমরি এবং প্রয়োগের সময় নির্ধারণ করুন। @ ক্যাডি, @ কেইটলিন, এবং @ ইউমিওর দ্রুততম নির্বাহের সময়গুলির সাথে ফাংশনগুলি ছিল - যদিও এই ফাংশনগুলি এত দ্রুত হয় আমরা সমস্ত উত্তরের জন্য .000 এবং .001 সেকেন্ডের গোলকে তুলনা করি। নৈতিক: উপরে আমার উত্তর সম্ভবত 'সেরা' উপায় নয়।

import pandas as pd
import cProfile, pstats, re

old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b','$c':'c','$d':'d','$e':'e'}

df = pd.DataFrame({'$a':[1,2], '$b': [10,20],'$c':['bleep','blorp'],'$d':[1,2],'$e':['texa$','']})

df.head()

def eumiro(df,nn):
    df.columns = nn
    #This direct renaming approach is duplicated in methodology in several other answers: 
    return df

def lexual1(df):
    return df.rename(columns=col_dict)

def lexual2(df,col_dict):
    return df.rename(columns=col_dict, inplace=True)

def Panda_Master_Hayden(df):
    return df.rename(columns=lambda x: x[1:], inplace=True)

def paulo1(df):
    return df.rename(columns=lambda x: x.replace('$', ''))

def paulo2(df):
    return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

def migloo(df,on,nn):
    return df.rename(columns=dict(zip(on, nn)), inplace=True)

def kadee(df):
    return df.columns.str.replace('$','')

def awo(df):
    columns = df.columns
    columns = [row.replace("$","") for row in columns]
    return df.rename(columns=dict(zip(columns, '')), inplace=True)

def kaitlyn(df):
    df.columns = [col.strip('$') for col in df.columns]
    return df

print 'eumiro'
cProfile.run('eumiro(df,new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df,col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df,old_names,new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')

আপনার পুনরায় নামকরণের পদ্ধতিটি কেন দরকার? ভালো কিছু [( '$', '') সারিতে df.columns মধ্যে row.replace] এর জন্য আমাকে # df.columns = কাজ
shantanuo

আমি 'জিনিস' অংশ বুঝতে পারছি না। আমার বিকল্প কি আছে? পুরানো কলামগুলি?
Andrea Ianni ௫

18

যাক এটি আপনার ডেটাফ্রেম।

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

আপনি দুটি পদ্ধতি ব্যবহার করে কলামগুলির নাম পরিবর্তন করতে পারেন।

  1. ব্যবহার dataframe.columns=[#list]

    df.columns=['a','b','c','d','e']

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

    এই পদ্ধতির সীমাবদ্ধতা হ'ল যদি একটি কলাম পরিবর্তন করতে হয়, সম্পূর্ণ কলাম তালিকাটি পাস করতে হবে। এছাড়াও, সূচক লেবেলে এই পদ্ধতি প্রযোজ্য নয়। উদাহরণস্বরূপ, আপনি যদি এটি পাস করেছেন:

    df.columns = ['a','b','c','d']

    এটি একটি ত্রুটি নিক্ষেপ করবে। দৈর্ঘ্যের অমিল: প্রত্যাশিত অক্ষের 5 টি উপাদান রয়েছে, নতুন মানগুলিতে 4 টি উপাদান রয়েছে।

  2. অন্য পদ্ধতি হ'ল পান্ডাস rename()পদ্ধতি যা কোনও সূচক, কলাম বা সারিটির নাম পরিবর্তন করতে ব্যবহৃত হয়

    df = df.rename(columns={'$a':'a'})

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

একইভাবে, আপনি যে কোনও সারি বা কলাম পরিবর্তন করতে পারেন।


17
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})

আপনার কলামের নতুন তালিকাটি যদি বিদ্যমান কলামগুলির একই ক্রমে থাকে তবে অ্যাসাইনমেন্টটি সহজ:

new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
   a  b  c  d  e
0  1  1  1  1  1

আপনার যদি পুরানো কলামের নামগুলিতে নতুন কলামের নামগুলিতে একটি অভিধান থাকে তবে আপনি নিম্নলিখিতটি করতে পারেন:

d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col])  # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
   a  b  c  d  e
0  1  1  1  1  1

যদি আপনার কাছে কোনও তালিকা বা অভিধান ম্যাপিং না থাকে তবে আপনি তালিকা $বোধের মাধ্যমে নেতৃস্থানীয় প্রতীকটি ছাঁটাই করতে পারেন :

df.columns = [col[1:] if col[0] == '$' else col for col in df]

2
পরিবর্তে lambda col: d[col]আপনি পাস করতে পারেন d.get... সুতরাং এটির মতো দেখতে হবেdf.columns.map(d.get)
পিয়ারস্কোয়ার্ড


15

আসুন একটি ছোট উদাহরণ দিয়ে নামকরণ বুঝি ...

1. ম্যাপিং ব্যবহার করে কলামগুলি নামকরণ:

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) #creating a df with column name A and B
df.rename({"A": "new_a", "B": "new_b"},axis='columns',inplace =True) #renaming column A with 'new_a' and B with 'new_b'

output:
   new_a  new_b
0  1       4
1  2       5
2  3       6

২. ম্যাপিং ব্যবহার করে সূচি / রো নাম নামকরণ:

df.rename({0: "x", 1: "y", 2: "z"},axis='index',inplace =True) #Row name are getting replaced by 'x','y','z'.

output:
       new_a  new_b
    x  1       4
    y  2       5
    z  3       6

সর্বাধিক উচ্চতর উত্তোলিত উত্তরের ইতিমধ্যে এরকম উদাহরণ রয়েছে ...
ইত্তামার মুশকিন

14

আমরা আসল কলাম লেবেলগুলি প্রতিস্থাপন করতে পারার আরেকটি উপায় হ'ল মূল কলাম লেবেলগুলি থেকে অযাচিত অক্ষর (এখানে '$') কেটে ফেলা।

এটি df.colলামের উপর লুপ চালিয়ে এবং স্ট্র্যাপড কলামগুলি df.colums এ সংযুক্ত করে করা যেতে পারে।

পরিবর্তে, নীচের মতো তালিকা বোধগম্যতা ব্যবহার করে আমরা একক বিবৃতিতে ঝরঝরেভাবে এটি করতে পারি:

df.columns = [col.strip('$') for col in df.columns]

( stripপাইথনের পদ্ধতি স্ট্রিংয়ের শুরু এবং শেষ থেকে প্রদত্ত চরিত্রটিকে আলাদা করে দেয়))


2
কীভাবে / কেন এটি কাজ করে তা আপনি ব্যাখ্যা করতে পারেন? যা উত্তরটি ভবিষ্যতের পাঠকদের জন্য আরও মূল্যবান করে তুলবে।
ড্যান লো 30

12

রিয়েল সহজ কেবল ব্যবহার

df.columns = ['Name1', 'Name2', 'Name3'...]

এবং এটি আপনার দেওয়া আদেশ অনুসারে কলামের নামগুলি অর্পণ করবে


10

আপনি এটির str.sliceজন্য ব্যবহার করতে পারেন :

df.columns = df.columns.str.slice(1)

1
পিএস: এটি আরও ভার্জোজ সমতুল্য df.columns.str[1:]... এটি ব্যবহার করা সম্ভবত এটি আরও ভাল, এটি খাটো এবং আরও সুস্পষ্ট।
CS95

9

আমি জানি এই প্রশ্ন এবং উত্তরটি মৃত্যুর জন্য চিবানো হয়েছে। তবে আমি যে সমস্যার মুখোমুখি হয়েছি তার জন্য অনুপ্রেরণার জন্য আমি এটি উল্লেখ করেছি। আমি বিভিন্ন উত্তর থেকে বিট এবং টুকরো ব্যবহার করে এটি সমাধান করতে সক্ষম হয়েছি সুতরাং কারও যদি প্রয়োজন হয় তবে আমার প্রতিক্রিয়া সরবরাহ করে providing

আমার পদ্ধতিটি জেনেরিক যেখানে আপনি কমা দ্বারা পৃথক করে অতিরিক্ত সীমানা যুক্ত করতে পারেন delimiters= ভেরিয়েবল এবং ভবিষ্যতের প্রমাণ সহ ।

কাজের কোড:

import pandas as pd
import re


df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

আউটপুট:

>>> df
   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

>>> df
   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

8

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

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

8

নিয়মিত এক্সপ্রেশন ব্যবহার করে নতুন নামকরণ করা হ'ল:

import pandas as pd
import re

df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})

df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

6

আপনি যদি আপনার নিয়ন্ত্রণের বাইরে সরবরাহকারী সিস্টেমের নামে প্রচুর পরিমাণে কলামগুলি মোকাবেলা করতে চান তবে আমি নিম্নলিখিত পদ্ধতির সাথে উপস্থিত হয়েছি যা একটি সাধারণ পদ্ধতির সংমিশ্রণ এবং একসাথে নির্দিষ্ট প্রতিস্থাপনের মিশ্রণ।

প্রথমে রেগেক্স এক্সপ্রেশন ব্যবহার করে ডেটাফ্রেম কলামের নামগুলি থেকে একটি অভিধান তৈরি করুন যাতে কলামের নামের নির্দিষ্ট কিছু পরিশিষ্ট ফেলে দেওয়া যায় এবং তারপরে প্রাপ্ত ডাটাবেসে প্রত্যাশা অনুযায়ী কোর কলামগুলির নাম করার জন্য অভিধানে নির্দিষ্ট প্রতিস্থাপন যুক্ত করুন।

এটি একসাথে ডেটাফ্রেমে প্রয়োগ করা হয়।

dict=dict(zip(df.columns,df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)','')))
dict['brand_timeseries:C1']='BTS'
dict['respid:L']='RespID'
dict['country:C1']='CountryID'
dict['pim1:D']='pim_actual'
df.rename(columns=dict, inplace=True)

5

ইতিমধ্যে সরবরাহ করা সমাধান ছাড়াও, আপনি ফাইলটি পড়ার সময় সমস্ত কলামগুলি প্রতিস্থাপন করতে পারেন। আমরা ব্যবহার করতে পারি namesএবংheader=0 করতে পারি।

প্রথমত, আমরা যে নামগুলি আমাদের কলামের নাম হিসাবে ব্যবহার করতে চাই তার একটি তালিকা তৈরি করি:

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

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


4

এখানে টাইপিংয়ে কাটতে ব্যবহার করতে আমি চাই নিফটির একটি ছোট্ট ফাংশন:

def rename(data, oldnames, newname): 
    if type(oldnames) == str: #input can be a string or list of strings 
        oldnames = [oldnames] #when renaming multiple columns 
        newname = [newname] #make sure you pass the corresponding list of new names
    i = 0 
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0: 
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: #doesn't have to be an exact match 
            print("Found multiple columns that matched " + str(name) + " :")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1 
    return data   

এটি কীভাবে কাজ করে তার উদাহরণ এখানে:

In [2]: df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['col1','col2','omg','idk'])
#first list = existing variables
#second list = new names for those variables
In [3]: df = rename(df, ['col','omg'],['first','ohmy']) 
Found multiple columns that matched col :
0: col1
1: col2

please enter the index of the column you would like to rename: 0

In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')

1
এই জাতীয় ফাংশনের জন্য ব্যবহারের ক্ষেত্রেটি খুব বিরল। বেশিরভাগ ক্ষেত্রে, আমি জানি আমি কী সন্ধান করছি এবং আমি কীভাবে এর নাম পরিবর্তন করতে চাই, আমি কেবল এটিকে নিজেরাই নির্ধারণ / সংশোধন করব।
CS95

1
@ cs95 আমি বৃহত্তর জাতীয় বা আন্তর্জাতিক সমীক্ষায় কাজ করার প্রবণতা পাই যেখানে ভেরিয়েবলগুলির উত্তর বিকল্পগুলি, পছন্দসই স্কেলগুলি এবং শাখার উপর নির্ভর করে প্রিফিক্স দিয়ে শুরু হওয়া ভেরিয়েবলের নাম থাকবে (যেমন EDU_2913.443, EDU_2913.421, ...)। এই ধরণের সেটগুলির সাথে কাজ করার জন্য এই ফাংশনটি আমার পক্ষে খুব কার্যকর হয়েছে, আমি বুঝতে পারি এটি যদি আপনার জন্য না হয় তবে :)
Seeiespi


2

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

import pandas as pd
import re

srch=re.compile(r"\w+")

data=pd.read_csv("CSV_FILE.csv")
cols=data.columns
new_cols=list(map(lambda v:v.group(),(list(map(srch.search,cols)))))
data.columns=new_cols

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

লক্ষ্য করুন কীভাবে সেরা-রেট করা উত্তরের জন্য কিছু প্রকারের হার্ড কোডিং প্রয়োজন এবং সবচেয়ে খারাপ রেট দেওয়া উত্তরের জন্য কেবল বর্ণনামূলক এবং পদ্ধতিগত পদ্ধতির প্রয়োজন?
কৌস্তুব জে

এর চেয়ে আরও ভাল (আরও পঠনযোগ্য) সমাধান রয়েছে যা রেগেক্সকে ব্যবহার করে। একটি সাধারণ নামকরণের অপারেশনের জন্য এটি এর চেয়ে আরও বেশি কিছু করছে। ত্রুটিগুলি পরিচালনা করতে আপনি কিছু করেননি এমন ক্ষেত্রে কোনও কিছুর সাথে মেলে না এমন বিপদও রয়েছে the
CS95
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.