আমি সিএক্সরোডার্স জবাবের বাইরে একটি সামান্য ফাংশন করেছি , যা কোনও তথ্য ফ্রেম বা সিরিজ থেকে পৃথক করে কোনও সূচীতে খাঁটিভাবে কাজ করে তাই আইএমএইচও সবচেয়ে ভাল সমাধান।
আমি যুক্ত করেছিলাম একটি ফিক্স: to_frame()
পদ্ধতিটি সূচক স্তরগুলির জন্য নতুন নামগুলি আবিষ্কার করবে যেগুলির একটি নেই। যেমন নতুন সূচকের নাম থাকবে যা পুরাতন সূচীতে বিদ্যমান নেই। এই নাম পরিবর্তনটি ফিরিয়ে আনতে আমি কিছু কোড যুক্ত করেছি।
নীচে কোডটি দেওয়া হয়েছে, আমি এটি কিছুক্ষণ নিজের জন্য ব্যবহার করেছি এবং মনে হচ্ছে এটি ঠিকঠাক কাজ করে। আপনি যদি কোনও সমস্যা বা প্রান্তের কেস পান তবে আমি আমার উত্তরটি সামঞ্জস্য করতে অনেক বেশি বাধ্য।
import pandas as pd
def _handle_insert_loc(loc: int, n: int) -> int:
"""
Computes the insert index from the right if loc is negative for a given size of n.
"""
return n + loc + 1 if loc < 0 else loc
def add_index_level(old_index: pd.Index, value: Any, name: str = None, loc: int = 0) -> pd.MultiIndex:
"""
Expand a (multi)index by adding a level to it.
:param old_index: The index to expand
:param name: The name of the new index level
:param value: Scalar or list-like, the values of the new index level
:param loc: Where to insert the level in the index, 0 is at the front, negative values count back from the rear end
:return: A new multi-index with the new level added
"""
loc = _handle_insert_loc(loc, len(old_index.names))
old_index_df = old_index.to_frame()
old_index_df.insert(loc, name, value)
new_index_names = list(old_index.names)
new_index_names.insert(loc, name)
new_index = pd.MultiIndex.from_frame(old_index_df, names=new_index_names)
return new_index
এটি নিম্নলিখিত ইউনিটেস্ট কোডটি পাস করেছে:
import unittest
import numpy as np
import pandas as pd
class TestPandaStuff(unittest.TestCase):
def test_add_index_level(self):
df = pd.DataFrame(data=np.random.normal(size=(6, 3)))
i1 = add_index_level(df.index, "foo")
self.assertEqual([None, None], i1.names)
self.assertTrue(np.all(i1.get_level_values(0) == "foo"))
self.assertTrue(np.all(i1.get_level_values(1) == df.index))
i2 = add_index_level(i1, ["x", "y"]*3, name="xy", loc=2)
i3 = add_index_level(i2, ["a", "b", "c"]*2, name="abc", loc=-1)
self.assertEqual([None, None, "xy", "abc"], i3.names)
self.assertTrue(np.all(i3.get_level_values(0) == "foo"))
self.assertTrue(np.all(i3.get_level_values(1) == df.index))
self.assertTrue(np.all(i3.get_level_values(2) == ["x", "y"]*3))
self.assertTrue(np.all(i3.get_level_values(3) == ["a", "b", "c"]*2))
axis=1
, যেহেতুdf.columns
সূচকের মতো "সেট_ইন্ডেক্স" পদ্ধতিটি নেই, যা সর্বদা আমাকে বাগড করে।