পান্ডস: একটি বহু-স্তরের কলাম সূচক থেকে একটি স্তর ছেড়ে?


242

যদি আমি একটি বহু-স্তরের কলাম সূচক পেয়েছি:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> pd.DataFrame([[1,2], [3,4]], columns=cols)
    একটি
   --- -
    খ | গ
- + + --- -
0 | 1 | 2
1 | 3 | 4

আমি কীভাবে সেই সূচকের "একটি" স্তরটি ফেলে দিতে পারি, তাই আমি এখানেই শেষ করব:

    খ | গ
- + + --- -
0 | 1 | 2
1 | 3 | 4

3
ডেটাফ্রেম পদ্ধতিটি আপনার সূচী এবং কলাম উভয়ের জন্যই এটি করা ভাল। হয় ছেড়ে দেওয়া বা সূচকের স্তর নির্বাচন করা।
সেরেন

@ সেরেন স্ট্যাকওভারফ্লো . com/a/56080234/ 3198568 দেখুন । droplevelকাজগুলি প্যারামিটারের মাধ্যমে মাল্টিলেভাল ইনডেক্স বা কলামগুলিতে কাজ করতে পারে axis
আয়রন

উত্তর:


306

আপনি ব্যবহার করতে পারেন MultiIndex.droplevel:

>>> cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
>>> df = pd.DataFrame([[1,2], [3,4]], columns=cols)
>>> df
   a   
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]
>>> df.columns = df.columns.droplevel()
>>> df
   b  c
0  1  2
1  3  4

[2 rows x 2 columns]

55
কোন স্তরটি বাদ পড়ছে তা স্পষ্ট করে বলা ভাল। স্তরগুলি শীর্ষ থেকে শুরু করে 0-সূচিযুক্ত হয়। >>> df.columns = df.columns.droplevel(0)
টেড পেট্রো

6
আপনি যে সূচকটি ছাড়ার চেষ্টা করছেন সেটি যদি বাম (সারি) দিকে থাকে এবং উপরের (কলাম) দিকে না থাকে, আপনি "কলামগুলি" "সূচক" তে পরিবর্তন করতে পারেন এবং একই পদ্ধতিটি ব্যবহার করতে পারেন:>>> df.index = df.index.droplevel(1)
আইডোডো

7
পান্ডা সংস্করণে 0.23.4, df.columns.droplevel()আর উপলভ্য নয়।
ইয়ংহম

8
@ অওংহম এটি আছে, আপনি সম্ভবত এটি কলামগুলিতে কল করছেন যেগুলির কোনও মাল্টি-ইনডেক্স নেই
ম্যাট হ্যারিসন

1
আমার তিনটি স্তর গভীর ছিল এবং আমি নীচের দিকে যেতে চাই wanted আমি খুঁজে পেয়েছি যে সর্বনিম্ন (স্তর [2]) এবং তারপরে সর্বোচ্চ (স্তর [0]) সবচেয়ে ভাল কাজ করেছে। >>>df.columns = df.columns.droplevel(2) >>>df.columns = df.columns.droplevel(0)
কাইল সি

65

সূচকে বাদ দেওয়ার আরেকটি উপায় হল তালিকা বোঝার ব্যবহার:

df.columns = [col[1] for col in df.columns]

   b  c
0  1  2
1  3  4

নীচের উদাহরণে যেখানে নীচের স্তরের দুটিতে 'y' রয়েছে এমন দুটি স্তরের নামগুলি সংযুক্ত করতে চাইলে এই কৌশলটিও দরকারী useful

cols = pd.MultiIndex.from_tuples([("A", "x"), ("A", "y"), ("B", "y")])
df = pd.DataFrame([[1,2, 8 ], [3,4, 9]], columns=cols)

   A     B
   x  y  y
0  1  2  8
1  3  4  9

শীর্ষ স্তরটি ফেলে দেওয়া সূচি 'y' দিয়ে দুটি কলাম ছেড়ে যাবে। তালিকা বোধের সাথে নামগুলি যোগ করে এড়ানো যায় That

df.columns = ['_'.join(col) for col in df.columns]

    A_x A_y B_y
0   1   2   8
1   3   4   9

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


2
[col[1] for col in df.columns]আরও সরাসরি df.columns.get_level_values(1)
এরিক হে লেবিগোট

2
কিছু কলামের খালি স্তরের মান ছিল এমন একই চাহিদা ছিল। নিম্নলিখিতগুলি ব্যবহার করেছেন:[col[0] if col[1] == '' else col[1] for col in df.columns]
লোগান

43

এটি করার আরেকটি উপায় হ'ল .xs পদ্ধতি ব্যবহার করে dfক্রস বিভাগের ভিত্তিতে পুনরায় সাইন করাdf

>>> df

    a
    b   c
0   1   2
1   3   4

>>> df = df.xs('a', axis=1, drop_level=True)

    # 'a' : key on which to get cross section
    # axis=1 : get cross section of column
    # drop_level=True : returns cross section without the multilevel index

>>> df

    b   c
0   1   2
1   3   4

1
এটি কেবলমাত্র যখনই পুরো কলাম স্তরের জন্য একক লেবেল থাকে তখনই কাজ করে।
টেড পেট্রো 16

1
আপনি যখন দ্বিতীয় স্তরটি ফেলে যেতে চান তখন কাজ করে না।
সেরেন

আপনি যদি একই স্তরের জন্য টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করতে চান তবে এটি একটি দুর্দান্ত সমাধান। আপনি যদি দ্বিতীয় স্তরে টুকরো টুকরো করতে চান (বলুন b) তবে সেই স্তরটি ফেলে দিন এবং প্রথম স্তর ( a) দিয়ে রেখে যান , নিম্নলিখিতগুলি কাজ করবে:df = df.xs('b', axis=1, level=1, drop_level=True)
টিফানি জি। উইলসন

27

পান্ডাস 0.24.0 হিসাবে , আমরা এখন ডেটাফ্রেম.ড্রোপলভেল () ব্যবহার করতে পারি :

cols = pd.MultiIndex.from_tuples([("a", "b"), ("a", "c")])
df = pd.DataFrame([[1,2], [3,4]], columns=cols)

df.droplevel(0, axis=1) 

#   b  c
#0  1  2
#1  3  4

আপনি যদি আপনার ডেটাফ্রেম পদ্ধতি-চেইন রোলিং রাখতে চান তবে এটি খুব কার্যকর।


এটি "বিশুদ্ধতম" সমাধান যা একটি "ডেটা পরিবর্তিত" পরিবর্তে একটি নতুন ডেটাফ্রেম ফিরে আসে।
এলিয়াদএল

16

কলামগুলির নাম পরিবর্তন করে আপনি এটি অর্জন করতে পারেন:

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

এটিতে একটি ম্যানুয়াল পদক্ষেপ জড়িত তবে এটি বিকল্প হতে পারে বিশেষত যদি আপনি অবশেষে আপনার ডেটা ফ্রেমের নাম পরিবর্তন করেন।


এটি মূলত মিন্টের প্রথম উত্তরটি করে। এখন, নামগুলি (যা সাধারণত ক্লান্তিকর) এর তালিকা নির্দিষ্ট করার দরকার নেই, কারণ এটি আপনাকে দিয়ে গেছে df.columns.get_level_values(1)
এরিক হে লেবিগোট

13

sum স্তর = 1 দিয়ে একটি ছোট কৌশল (যখন স্তর = 1 সমস্ত অনন্য থাকে তখন কাজ করে)

df.sum(level=1,axis=1)
Out[202]: 
   b  c
0  1  2
1  3  4

আরও সাধারণ সমাধান get_level_values

df.columns=df.columns.get_level_values(1)
df
Out[206]: 
   b  c
0  1  2
1  3  4

4

আমার ড্রপলভেল () ফাংশনটি কেন কাজ করে না তা আমি জানি না বলে আমি এই সমস্যার সাথে লড়াই করেছি। বেশ কয়েকটি মাধ্যমে কাজ করুন এবং আপনার টেবিলের 'এ' হ'ল কলামের নাম এবং 'বি', 'সি' সূচক। এইভাবে সাহায্য করবে

df.columns.name = None
df.reset_index() #make index become label

1
এটি কাঙ্ক্ষিত আউটপুট মোটেও পুনরুত্পাদন করে না।
এরিক হে লেবিগোট

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