পান্ডায় একাধিক ডেটা ফ্রেম কলামগুলিতে কীভাবে "স্বতন্ত্র নির্বাচন করবেন"?


108

আমি এসকিউএল এর সমতুল্য করার উপায় খুঁজছি

SELECT DISTINCT col1, col2 FROM dataframe_table

পান্ডাস স্কিলের তুলনা সম্পর্কে কিছুই নেই distinct

.unique() কেবলমাত্র একটি একক কলামের জন্যই কাজ করে, সুতরাং আমি মনে করি আমি কলামগুলি একত্রীকরণ করতে পারি, বা তাদের একটি তালিকা / টুপলে রাখতে পারি এবং সেভাবে তুলনা করতে পারি, তবে এটিকে মনে হয় কিছু প্যান্ডাকে আরও দেশীয় উপায়ে করা উচিত।

আমি কি স্পষ্ট কিছু মিস করছি, বা এটি করার কোনও উপায় নেই?


আপনার মতো কিছু করতে df.apply(pd.Series.unique)হবে তবে কলামগুলিতে অনন্য মানের সংখ্যা পরিবর্তিত হলে এটি কাজ করবে না তাই আপনাকে কলামের নামগুলি কী হিসাবে মান এবং অনন্য মূল্যবোধ হিসাবে মান তৈরি করতে হবে
এডচুম

উত্তর:


182

আপনি drop_duplicatesডেটা ফ্রেমের অনন্য সারিগুলি পেতে পদ্ধতিটি ব্যবহার করতে পারেন :

In [29]: df = pd.DataFrame({'a':[1,2,1,2], 'b':[3,4,3,5]})

In [30]: df
Out[30]:
   a  b
0  1  3
1  2  4
2  1  3
3  2  5

In [32]: df.drop_duplicates()
Out[32]:
   a  b
0  1  3
1  2  4
3  2  5

আপনি subsetযদি স্বতন্ত্রতা নির্ধারণের জন্য নির্দিষ্ট কিছু কলাম ব্যবহার করতে চান তবে আপনি কীওয়ার্ড আর্গুমেন্টও সরবরাহ করতে পারেন। ডক্টরসিং দেখুন ।


4
সম্ভবত লক্ষ্য করার মতো যে df.drop_duplicates()ডিফল্টরূপে কোনও অন্তর্ভুক্ত পদ্ধতি নয়, সুতরাং একটি নতুন ডেটাফ্রেম ফেরায় ( dfঅপরিবর্তিত রেখে )। এটি মোটামুটি স্ট্যান্ডার্ড আচরণ, তবে এটি এখনও কার্যকর পয়েন্ট আউট হতে পারে।
21

15

আমি বিভিন্ন সমাধান চেষ্টা করেছি। প্রথমটি ছিল:

a_df=np.unique(df[['col1','col2']], axis=0)

এবং এটি অবজেক্ট ডেটা না করার জন্য ভাল কাজ করে এটি করার এবং ত্রুটি এড়ানোর জন্য আরেকটি উপায় (অবজেক্ট কলামের ধরণের জন্য) ড্রপ_ডুপ্লিকেটগুলি প্রয়োগ করা ()

a_df=df.drop_duplicates(['col1','col2'])[['col1','col2']]

এটি করার জন্য আপনি এসকিউএলও ব্যবহার করতে পারেন তবে এটি আমার ক্ষেত্রে খুব ধীর হয়ে গেছে:

from pandasql import sqldf
q="""SELECT DISTINCT col1, col2 FROM df;"""
pysqldf = lambda q: sqldf(q, globals())
a_df = pysqldf(q)

7

uniqueডিএফ-এর জন্য কোনও পদ্ধতি নেই , যদি প্রতিটি কলামের জন্য স্বতন্ত্র মানগুলির সংখ্যা একই হয় তবে নিম্নলিখিতগুলি কাজ করবে: df.apply(pd.Series.unique)তবে তা না হলে আপনি একটি ত্রুটি পাবেন। আর একটি পদ্ধতির মান হ'ল একটি ডিকের মধ্যে মানগুলি জমা করা যা কলামের নামের উপর ভিত্তি করে রয়েছে:

In [111]:
df = pd.DataFrame({'a':[0,1,2,2,4], 'b':[1,1,1,2,2]})
d={}
for col in df:
    d[col] = df[col].unique()
d

Out[111]:
{'a': array([0, 1, 2, 4], dtype=int64), 'b': array([1, 2], dtype=int64)}

একাধিক কলামের জন্য অনন্য পরীক্ষা করা কি সম্ভব?
অনুপ ডি

নিম্পি ব্যবহার করে অন্য একটি এসও প্রশ্নের উত্তর পেয়েছেনnp.unique(df[['column1','column2']].values)
আনুপ ড

7

অনুরূপ সমস্যা সমাধানের জন্য, আমি ব্যবহার করছি groupby:

print(f"Distinct entries: {len(df.groupby(['col1', 'col2']))}")

এটি উপযুক্ত কিনা তা ফলাফলের সাথে আপনি কী করতে চান তার উপর নির্ভর করবে যদিও (আমার ক্ষেত্রে, আমি COUNT DISTINCTযেমন দেখানো হয়েছে তার সমতুল্য চেয়েছিলাম )।


1

আমি মনে করি drop duplicateকখনও কখনও ডেটাফ্রেম নির্ভর করে ব্যবহার এত কার্যকর হয় না।

আমি এটি খুঁজে পেয়েছি:

[in] df['col_1'].unique()
[out] array(['A', 'B', 'C'], dtype=object)

এবং আমার জন্য কাজ!

https://riptorial.com/pandas/example/26077/select-distinct-rows-across-dataframe


-1

আপনি কলামগুলির সেট নিতে পারেন এবং কেবল বৃহত্তর সেট থেকে ছোট সেটটি বিয়োগ করতে পারেন:

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