এক লাইন বা পাইপলাইন সমাধান
আমি দুটি বিষয়ে মনোনিবেশ করব:
ওপি স্পষ্টভাবে বলেছে
আমার সম্পাদিত কলামের নামগুলি এটি একটি তালিকায় সঞ্চিত আছে, তবে কলামের নামগুলি কীভাবে প্রতিস্থাপন করা যায় তা আমি জানি না।
আমি '$'প্রতিটি কলামের শিরোনামের প্রথম অক্ষরটি কীভাবে প্রতিস্থাপন করতে বা ফেলা করতে পারি তার সমস্যাটি সমাধান করতে চাই না । ওপি ইতিমধ্যে এই পদক্ষেপটি করেছে। পরিবর্তে আমি বিদ্যমান columnsঅবজেক্টটি প্রতিস্থাপন কলামের নামের একটি তালিকা দিয়ে একটি নতুন দিয়ে প্রতিস্থাপনের দিকে মনোনিবেশ করতে চাই ।
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_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