তালিকা থেকে ডেটাফ্রেমে কলাম যুক্ত করুন


95

এই জাতীয় কিছু কলাম সহ আমার একটি ডেটাফ্রেম রয়েছে:

A   B   C  
0   
4
5
6
7
7
6
5

A তে সম্ভাব্য পরিসীমা কেবল 0 থেকে 7 পর্যন্ত

এছাড়াও, আমার কাছে এই জাতীয় 8 টি উপাদানের একটি তালিকা রয়েছে:

List=[2,5,6,8,12,16,26,32]  //There are only 8 elements in this list

কলামের ক কলের উপাদানটি যদি এন হয় , তবে আমাকে তালিকা থেকে নতুন কলামে n তম উপাদানটি সন্নিবেশ করাতে হবে , 'ডি' বলুন।

পুরো ডেটাফ্রেমটি লুপ না করে আমি কীভাবে একসাথে এটি করতে পারি?

ফলস্বরূপ ডেটাফ্রেমটি দেখতে এমন হবে:

A   B   C   D
0           2
4           12
5           16
6           26
7           32
7           32
6           26
5           16

দ্রষ্টব্য: ডেটাফ্রেম বিশাল এবং পুনরাবৃত্তি হ'ল শেষ বিকল্প বিকল্প। তবে ডিকের মতো অন্য কোনও ডেটা স্ট্রাকচারে আমি 'তালিকা' তে উপাদানগুলিও সাজিয়ে রাখতে পারি necessary


4
আমি মনে করি আপনার পছন্দসই ফলাফল সহ একটি (ছোট) খেলনা উদাহরণ প্রয়োজন। এটি কিছুটা অস্পষ্ট মনে হয়।
অ্যান্ডি হেডেন

11
কখনও কোনও ভেরিয়েবল "তালিকা" কল করবেন না। যে কোনও ভাষায়।
lucid_dreamer

উত্তর:


51

আইআইইউসি, যদি আপনি নিজের (দুর্ভাগ্যক্রমে নাম দেওয়া) Listএকটি করে তোলে ndarray, আপনি কেবল প্রাকৃতিকভাবে এটিতে সূচক করতে পারেন।

>>> import numpy as np
>>> m = np.arange(16)*10
>>> m[df.A]
array([  0,  40,  50,  60, 150, 150, 140, 130])
>>> df["D"] = m[df.A]
>>> df
    A   B   C    D
0   0 NaN NaN    0
1   4 NaN NaN   40
2   5 NaN NaN   50
3   6 NaN NaN   60
4  15 NaN NaN  150
5  15 NaN NaN  150
6  14 NaN NaN  140
7  13 NaN NaN  130

এখানে আমি একটি নতুন তৈরি করেছি m, তবে আপনি যদি ব্যবহার করেন m = np.asarray(List)তবে একই জিনিসটি ব্যবহার করা উচিত: মানগুলি df.Aএর উপযুক্ত উপাদানগুলি বেছে নেবে m


মনে রাখবেন যে আপনি যদি একটি পুরানো সংস্করণ ব্যবহার করেন তবে এর পরিবর্তে আপনাকে ব্যবহার numpyকরতে হতে পারে - m[df.A.values]অতীতে numpyঅন্যদের সাথে ভাল খেলেনি , এবং কিছুটা রিফ্যাক্টারে pandasকিছু মাথা ব্যথার কারণ হয়েছিল। জিনিস এখন উন্নতি হয়েছে।


হাই @ ডিএসএম : আমি আপনাকে কি বলছে কিন্তু আমি এই ত্রুটি পাচ্ছি পেতে Traceback (most recent call last): File "./b.py", line 24, in <module> d["D"] = m[d.A] IndexError: unsupported iterator index
কেশর

4
@ মান: ইউআরফ, এটি একটি পুরানো numpyবাগ। আপনার d["D"] = m[d.A.values]জন্য কাজ করে?
ডিএসএম

277

কেবলমাত্র তালিকাটি সরাসরি বরাদ্দ করুন:

df['new_col'] = mylist

বিকল্পটি
তালিকাটিকে একটি সিরিজ বা অ্যারেতে রূপান্তর করুন এবং তারপরে নিযুক্ত করুন:

se = pd.Series(mylist)
df['new_col'] = se.values

বা

df['new_col'] = np.array(mylist)

4
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
ইলিয়া রাসিন

@ স্প্যারো ব্যবহার pd.Seriesকরবেন কীভাবে? আমার অর্থ এটি কি ভাসমান এবং স্ট্রিংয়ের মতো স্ট্রিংগুলি ছেড়ে দেবে? অথবা তালিকার মধ্যে থাকা উপাদানগুলি স্ট্রিংগুলিতে ডিফল্ট হবে?
3kstc

4
ইলিয়ারুসিন, এটি একটি মিথ্যা ইতিবাচক যা এ ক্ষেত্রে উপেক্ষা করা যেতে পারে। আরও তথ্যের জন্য: স্ট্যাকওভারফ্লো.com
চড়ুই

4
এটিকে সরল করা যেতে পারে: ডিএফ ['new_col'] = পিডি eriesসরিজ (মাইলিস্ট) val মূল্যবোধগুলি
স্মার্টস

15

@ স্প্যারো থেকে দুর্দান্ত সমাধানের সমাধান।

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

ধরা যাক আপনি নিজের নতুন কলামটি সহজভাবে, নতুন_কলামে কল করতে চান

প্রথমে একটি সিরিজ তালিকা তৈরি করুন:

column_values = pd.Series(mylist)

তারপরে কলামটি যুক্ত করতে সন্নিবেশ ফাংশনটি ব্যবহার করুন। আপনি কলামটি কোন অবস্থানে রাখতে চান তা চয়ন করতে আপনাকে এই ফাংশনটির সুবিধা দেয়। নিম্নলিখিত উদাহরণে আমরা নতুন কলামটি বাম দিক থেকে প্রথম অবস্থানে অবস্থান করব (লোক = 0 সেট করে)

df.insert(loc=0, column='new_column', value=column_values)

আপনি যদি df এর সূচকগুলি অন্য কোনও কিছুতে পরিবর্তন করেন তবে এটি কাজ করবে না ... সেই ক্ষেত্রে আপনাকে লাইনগুলির মধ্যে যোগ করতে হবে: কলাম_মূল্য.ইন্ডেক্স = df.index
গাই এস

8

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

df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]})

এবং যে ম্যাপিংটি আপনি চান তা:

mapping = dict(enumerate([2,5,6,8,12,16,26,32]))

df['D'] = df['A'].map(mapping)

সম্পন্ন!

print df

আউটপুট:

   A   D
0  0   2
1  4  12
2  5  16
3  6  26
4  7  32
5  7  32
6  6  26
7  5  16

4
আমি মনে করি ওপি ইতিমধ্যে এটি কীভাবে করতে পারে জানে। আমার পড়ার মাধ্যমে সমস্যাটি Dএর উপাদানগুলি থেকে তৈরি করা হচ্ছে Aএবং List("কলামে ক উপাদানটি এন হলে, আমাকে একটি নতুন কলামে তালিকা থেকে n তম উপাদানটি প্রবেশ করানো দরকার, 'ডি' বলুন say")
ডিএসএম

এসও কোনও ধরণের এফ (* & আয়া অবস্থায় পরিণত হয়েছে turned মন্তব্যটির জন্য @ ডিএসএমকে ধন্যবাদ তবে আমি পোস্টটি সংশোধন করতে পারিনি যতক্ষণ না এটি সমীচীন পর্যালোচনা করা হয়েছিল এবং তারপরে এটি প্রত্যাখ্যান করা হয়েছিল কারণ এটি খুব দ্রুত ছিল and এবং তখন আমি ছিলাম আমার নিজের সম্পাদনাটি পর্যালোচনা করতে পেরেছেন এবং তারপরে অনেক দেরি হয়ে গেছে কারণ আরও খারাপ (আইএমএইচও) উত্তরটি "স্বীকৃত" হয়েছিল S তাই সত্যিই এমন কিছু মেটা-আন্নির সাহায্য পেয়েছেন যারা সাহায্যের চেয়ে কম নয় !!!!
ফিল কুপার

ঠিক আছে, আমি ন্যানির পক্ষে কথা বলতে পারি না তবে আপনি দেখতে পাবেন যে আপনার পদ্ধতিটি দীর্ঘ অ্যারেতে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে যায়। অন্য ক্ষেত্রে অবশ্যই, এর মধ্যে নির্বাচন করা np.array(List)[df.A]এবং df["A"].map(dict(enumerate(List)))বেশিরভাগ পছন্দের বিষয়।
ডিএসএম

হাই ফিল, আমি কেবলমাত্র আপনার সমাধান এবং ডিএসএম এর মন্তব্য দেখেছি এবং তারপরে আর কখনও ফিরে আসেনি যেহেতু ডিএসএমের সমাধানটি আমার পক্ষে ভাল কাজ করেছে। তবে এখন আপনার সমাধানটির দিকে তাকালে এটিও কার্যকর হয়। আমার প্রায় 200k এন্ট্রিগুলির ডেটাসেটে আমি ডিএসএমের সমাধানটি চালিয়েছি এবং এটি আমার কাছে থাকা অন্যান্য সমস্ত গণনার সাথে কয়েক সেকেন্ডে চলে। আমি পাইথন-পান্ডাসে সম্পূর্ণ নতুন এবং ব্যক্তিগতভাবে মার্জিত বা দুর্দান্ত কিছু খুঁজছিলাম না; যা কিছু কাজ ঠিক ছিল। তবে সত্যই, সমাধানের জন্য ধন্যবাদ।
mane

2

পুরানো প্রশ্ন; তবে আমি সর্বদা দ্রুততম কোডটি ব্যবহার করার চেষ্টা করি!

আমার 69 মিলিয়ন ইউন্ট 64 সহ একটি বিশাল তালিকা ছিল। np.array () আমার জন্য দ্রুততম ছিল।

df['hashes'] = hashes
Time spent: 17.034842014312744

df['hashes'] = pd.Series(hashes).values
Time spent: 17.141014337539673

df['key'] = np.array(hashes)
Time spent: 10.724546194076538
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.