এক লাইন বা পাইপলাইন সমাধান
আমি দুটি বিষয়ে মনোনিবেশ করব:
ওপি স্পষ্টভাবে বলেছে
আমার সম্পাদিত কলামের নামগুলি এটি একটি তালিকায় সঞ্চিত আছে, তবে কলামের নামগুলি কীভাবে প্রতিস্থাপন করা যায় তা আমি জানি না।
আমি '$'
প্রতিটি কলামের শিরোনামের প্রথম অক্ষরটি কীভাবে প্রতিস্থাপন করতে বা ফেলা করতে পারি তার সমস্যাটি সমাধান করতে চাই না । ওপি ইতিমধ্যে এই পদক্ষেপটি করেছে। পরিবর্তে আমি বিদ্যমান columns
অবজেক্টটি প্রতিস্থাপন কলামের নামের একটি তালিকা দিয়ে একটি নতুন দিয়ে প্রতিস্থাপনের দিকে মনোনিবেশ করতে চাই ।
df.columns = new
new
নতুন কলামের নামের তালিকাটি যেখানে পাওয়া যায় তত সহজ। এই পদ্ধতির অপূর্ণতা হ'ল এটির জন্য বিদ্যমান ডাটাফ্রেমের 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.concat
df
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_index
। pd.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