পাইথন পান্ডাসে সমস্ত সদৃশ সারি ফেলে দিন


160

pandas drop_duplicatesফাংশন "uniquifying" একটি dataframe জন্য মহান। যাইহোক, পাসওয়ার্ডগুলির একটি মূল যুক্তি হ'ল take_last=Trueবা take_last=False, আমি কলামের সাবসেট জুড়ে ডুপ্লিকেটযুক্ত সমস্ত সারি ফেলে দিতে চাই। এটা কি সম্ভব?

    A   B   C
0   foo 0   A
1   foo 1   A
2   foo 1   B
3   bar 1   A

উদাহরণস্বরূপ, আমি কলামগুলিতে মেলে এমন সারিগুলি ফেলে দিতে চাই Aএবং Cতাই এটির সারি 0 এবং 1 বাদ দেওয়া উচিত।

উত্তর:


234

ড্রপ-ডুপ্লিকেট এবং কী প্যারামিটারের সাহায্যে পান্ডাগুলিতে এটি এখন আরও সহজ ।

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.drop_duplicates(subset=['A', 'C'], keep=False)

2
আমার কলামগুলি স্পষ্টভাবে লেবেলযুক্ত না হলে কী হবে? আমি কীভাবে তাদের সূচির ভিত্তিতে কলামগুলি নির্বাচন করব?
হামান স্যামুয়েল

2
হতে পারে df.reindex(df.iloc[:,[0,2]].drop_duplicates(keep=False).index)?
বেন

5
আপনি চেষ্টা করতে পারেনdf.drop_duplicates(subset=[df.columns[0:2]], keep = False)
Seeiespi

68

ড্রপ_লিপিগুলিতে কেবল বেনের উত্তর যুক্ত করতে চাই :

keep : {'প্রথম', 'শেষ', মিথ্যা}, ডিফল্ট 'প্রথম'

  • প্রথম: প্রথম উপস্থিতি বাদে সদৃশগুলি ফেলে দিন।

  • সর্বশেষ: শেষ ঘটনাটি বাদে সদৃশগুলি ফেলে দিন।

  • মিথ্যা: সমস্ত সদৃশ ফেলে দিন।

সুতরাং keepমিথ্যাতে সেট করা আপনাকে পছন্দসই উত্তর দেবে।

ডেটাফ্রেম.ড্রপ_ডুপ্লিকেটস (* আরগস, ** কোয়ার্গস) ডুপ্লিকেট সারি দিয়ে ডেটা ফ্রেম ফিরিয়ে দিন, কেবলমাত্র কিছু নির্দিষ্ট কলাম বিবেচনা করে

পরামিতি: সাবসেট: কলাম লেবেল বা লেবেলের অনুক্রম, dচ্ছিকভাবে কেবল নকল সনাক্তকরণের জন্য নির্দিষ্ট কলামগুলি বিবেচনা করুন, ডিফল্টরূপে সমস্ত কলাম রাখে: {'প্রথম', 'শেষ', মিথ্যা}, ডিফল্ট 'প্রথম' প্রথম: নকলগুলি বাদ দিন প্রথম ঘটনা জন্য। সর্বশেষ: শেষ ঘটনাটি বাদে সদৃশগুলি ফেলে দিন। মিথ্যা: সমস্ত সদৃশ ফেলে দিন। টেক_লাস্ট: প্রত্যাশিত জায়গায়: বুলিয়ান, ডিফল্ট মিথ্যা ডুপ্লিকেটগুলি জায়গায় রাখুন বা কোনও অনুলিপি ফিরিয়ে আনতে হবে: কুয়ার্গস কেবলমাত্র সাবসেটের আর্গুমেন্ট [অবনমিত] ফিরে এসেছে: নকল: ডেটা ফ্রেম


26

আপনি যদি ফলাফলটি অন্য কোনও ডেটাশেটে সংরক্ষণ করতে চান:

df.drop_duplicates(keep=False)

অথবা

df.drop_duplicates(keep=False, inplace=False)

যদি একই ডেটাসেট আপডেট করা দরকার:

df.drop_duplicates(keep=False, inplace=True)

উপরের উদাহরণগুলি সমস্ত নকল সরিয়ে ফেলবে DISTINCT *এবং এসকিউএল এর অনুরূপ একটি রাখবে


12

ব্যবহার groupbyএবংfilter

import pandas as pd
df = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":[0,1,1,1], "C":["A","A","B","A"]})
df.groupby(["A", "C"]).filter(lambda df:df.shape[0] == 1)

5

প্রকৃতপক্ষে, 0 এবং 1 সারিগুলিকে কেবল ড্রপ করতে হবে (এ এবং সি মিলিয়ে থাকা কোনও পর্যবেক্ষণ রাখা হয়েছে)):

In [335]:

df['AC']=df.A+df.C
In [336]:

print df.drop_duplicates('C', take_last=True) #this dataset is a special case, in general, one may need to first drop_duplicates by 'c' and then by 'a'.
     A  B  C    AC
2  foo  1  B  fooB
3  bar  1  A  barA

[2 rows x 4 columns]

তবে আমি সন্দেহ করি যে আপনি আসলে কী চান এটি হ'ল (এক এবং সি মিলিয়ে একটি পর্যবেক্ষণ রাখা হয়েছে।):

In [337]:

print df.drop_duplicates('AC')
     A  B  C    AC
0  foo  0  A  fooA
2  foo  1  B  fooB
3  bar  1  A  barA

[3 rows x 4 columns]

সম্পাদনা:

এখন এটি আরও পরিষ্কার, সুতরাং:

In [352]:
DG=df.groupby(['A', 'C'])   
print pd.concat([DG.get_group(item) for item, value in DG.groups.items() if len(value)==1])
     A  B  C
2  foo  1  B
3  bar  1  A

[2 rows x 3 columns]

1
আমি যদি যা চেয়েছিলাম তা যদি হয় df.drop_duplicates(['A','C'])তবে আমি প্রশ্নটিতে উল্লিখিত হিসাবে প্রথমে একটি পর্যবেক্ষণকে প্রথম বা শেষ হিসাবে রাখি - যদিও আমি ঠিক বুঝতে পেরেছি যে স্মৃতি থেকে লেখার সময় আমার কীওয়ার্ডটি ভুল ছিল। আমি যা চাই তা হ'ল সমস্ত সারি যেগুলি আগ্রহের কলামগুলিতে অভিন্ন (যেমন ডেটারে এ এবং সি) রয়েছে তা ফেলে দিন।
জেমি বুল

0

এই বিভিন্ন জিনিস চেষ্টা করুন

df = pd.DataFrame({"A":["foo", "foo", "foo", "bar","foo"], "B":[0,1,1,1,1], "C":["A","A","B","A","A"]})

>>>df.drop_duplicates( "A" , keep='first')

অথবা

>>>df.drop_duplicates( keep='first')

অথবা

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