পাইথনে পান্ডা ব্যবহার করে সমস্ত সদৃশ আইটেমের একটি তালিকা আমি কীভাবে পাব?


127

আমার কাছে আইটেমগুলির একটি তালিকা রয়েছে যা সম্ভবত কিছু রফতানি সমস্যা রয়েছে। আমি সদৃশ আইটেমগুলির একটি তালিকা পেতে চাই যাতে আমি ম্যানুয়ালি সেগুলি তুলনা করতে পারি। আমি যখন পান্ডাসের সদৃশ পদ্ধতিটি ব্যবহার করার চেষ্টা করি তখন এটি কেবল প্রথম নকলটিই দেয়। ডুপ্লিকেটগুলি কেবল প্রথমটি নয়, সমস্ত পাওয়ার কী উপায় আছে?

আমার ডেটাসেটের একটি ছোট্ট সাবসেকশনটি এরকম দেখাচ্ছে:

ID,ENROLLMENT_DATE,TRAINER_MANAGING,TRAINER_OPERATOR,FIRST_VISIT_DATE
1536D,12-Feb-12,"06DA1B3-Lebanon NH",,15-Feb-12
F15D,18-May-12,"06405B2-Lebanon NH",,25-Jul-12
8096,8-Aug-12,"0643D38-Hanover NH","0643D38-Hanover NH",25-Jun-12
A036,1-Apr-12,"06CB8CF-Hanover NH","06CB8CF-Hanover NH",9-Aug-12
8944,19-Feb-12,"06D26AD-Hanover NH",,4-Feb-12
1004E,8-Jun-12,"06388B2-Lebanon NH",,24-Dec-11
11795,3-Jul-12,"0649597-White River VT","0649597-White River VT",30-Mar-12
30D7,11-Nov-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",30-Nov-11
3AE2,21-Feb-12,"06405B2-Lebanon NH",,26-Oct-12
B0FE,17-Feb-12,"06D1B9D-Hartland VT",,16-Feb-12
127A1,11-Dec-11,"064456E-Hanover NH","064456E-Hanover NH",11-Nov-12
161FF,20-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",3-Jul-12
A036,30-Nov-11,"063B208-Randolph VT","063B208-Randolph VT",
475B,25-Sep-12,"06D26AD-Hanover NH",,5-Nov-12
151A3,7-Mar-12,"06388B2-Lebanon NH",,16-Nov-12
CA62,3-Jan-12,,,
D31B,18-Dec-11,"06405B2-Lebanon NH",,9-Jan-12
20F5,8-Jul-12,"0669C50-Randolph VT",,3-Feb-12
8096,19-Dec-11,"0649597-White River VT","0649597-White River VT",9-Apr-12
14E48,1-Aug-12,"06D3206-Hanover NH",,
177F8,20-Aug-12,"063B208-Randolph VT","063B208-Randolph VT",5-May-12
553E,11-Oct-12,"06D95A3-Hanover NH","06D95A3-Hanover NH",8-Mar-12
12D5F,18-Jul-12,"0649597-White River VT","0649597-White River VT",2-Nov-12
C6DC,13-Apr-12,"06388B2-Lebanon NH",,
11795,27-Feb-12,"0643D38-Hanover NH","0643D38-Hanover NH",19-Jun-12
17B43,11-Aug-12,,,22-Oct-12
A036,11-Aug-12,"06D3206-Hanover NH",,19-Jun-12

আমার কোডটি বর্তমানে এটির মতো দেখাচ্ছে:

df_bigdata_duplicates = df_bigdata[df_bigdata.duplicated(cols='ID')]

একটি দম্পতি সদৃশ আইটেম সেখানে। তবে, যখন আমি উপরের কোডটি ব্যবহার করি, আমি কেবল প্রথম আইটেমটি পাই। এপিআই রেফারেন্সে, আমি দেখতে পাচ্ছি যে আমি কীভাবে শেষ আইটেমটি পেতে পারি তবে আমি তাদের সমস্তটি দেখতে চাই যাতে আমি কেন তাত্পর্য পাচ্ছি তা দেখার জন্য আমি তাদের দৃষ্টি দিয়ে পরীক্ষা করতে পারি। সুতরাং, এই উদাহরণে আমি তিনটি A036 এন্ট্রি এবং উভয়ই 11795 এন্ট্রি এবং অন্য কোনও সদৃশ এন্ট্রি পেতে চাই, কেবল প্রথমটির পরিবর্তে। যে কোনও সহায়তা সর্বাধিক প্রশংসিত।


1
"অনুরুপগুলি" বিভিন্ন জিনিষ মানে করতে পারেন "আপনার ক্ষেত্রে, আপনি কেবল বিবেচনা করতে একটি একক কলাম মধ্যে সদৃশID একাধিক অভিন্ন সারি বা সব কলাম", না "।
smci

উত্তর:


170

পদ্ধতি # 1: আইডিটি নকলযুক্ত আইডির মধ্যে একটি যেখানে সমস্ত সারি মুদ্রণ করুন:

>>> import pandas as pd
>>> df = pd.read_csv("dup.csv")
>>> ids = df["ID"]
>>> df[ids.isin(ids[ids.duplicated()])].sort("ID")
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

তবে এতবার পুনরাবৃত্তি করা রোধ করার কোনও দুর্দান্ত উপায় আমি ভাবতে পারি নি ids। আমি groupbyআইডিতে # 2 পদ্ধতিটি পছন্দ করি ।

>>> pd.concat(g for _, g in df.groupby("ID") if len(g) > 1)
       ID ENROLLMENT_DATE        TRAINER_MANAGING        TRAINER_OPERATOR FIRST_VISIT_DATE
6   11795        3-Jul-12  0649597-White River VT  0649597-White River VT        30-Mar-12
24  11795       27-Feb-12      0643D38-Hanover NH      0643D38-Hanover NH        19-Jun-12
2    8096        8-Aug-12      0643D38-Hanover NH      0643D38-Hanover NH        25-Jun-12
18   8096       19-Dec-11  0649597-White River VT  0649597-White River VT         9-Apr-12
3    A036        1-Apr-12      06CB8CF-Hanover NH      06CB8CF-Hanover NH         9-Aug-12
12   A036       30-Nov-11     063B208-Randolph VT     063B208-Randolph VT              NaN
26   A036       11-Aug-12      06D3206-Hanover NH                     NaN        19-Jun-12

11
পদ্ধতি # 2 ঠিক নিখুঁত! তোমাকে অনেক ধন্যবাদ.
বিগহ্যান্ডসোম

4
যদি কোনও ডুপস না থাকে তবে পদ্ধতি # 2 ব্যর্থ হয় ("কনটেনেট করার জন্য কোনও জিনিস নেই")
সিপিবিএল

4
কি করে g for _ ?
ব্যবহারকারী 77005

5
@ user77005 আপনি ইতিমধ্যে মূর্ত আউট পারে করেছি, কিন্তু প্রত্যেকজনের সুবিধার জন্য, এটা ভালো লেখা আছে: g for (placeholder, g) in df.groupby('bla') if 'bla'; আন্ডারস্কোর একটি অনিবার্য যুক্তির স্থানধারকের জন্য একটি সাধারণ প্রতীক যেখানে আমরা এটি ল্যাম্বডা জাতীয় মত প্রকাশের জন্য কোনও কিছুর জন্য ব্যবহার করতে চাই না।
stucash

7
পদ্ধতি # 1 টি আপডেট করা দরকার: sortডেটা ফ্রেমগুলির জন্য হয় sort_valuesবা sort_index সম্পর্কিত এসও প্রশ্নোত্তরের
ট্যাটলার

138

পান্ডাস সংস্করণ ০.০7 সহ, সমস্ত অনুলিপি আইটেমগুলি পেতে ডুপ্লিকেট ফাংশনে আপনি 'রাখুন = মিথ্যা' সেট করতে পারেন ।

In [1]: import pandas as pd

In [2]: df = pd.DataFrame(['a','b','c','d','a','b'])

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

In [4]: df[df.duplicated(keep=False)]
Out[4]: 
       0
    0  a
    1  b
    4  a
    5  b

3
বিঙ্গো, উত্তর আছে। সুতরাং: str বা str বা বুলিয়ান ... বিজোড় এপিআই পছন্দ। 'all'আরও যুক্তিযুক্ত এবং স্বজ্ঞাত আইএমও হবে।
জারাড

92
df[df.duplicated(['ID'], keep=False)]

এটি সমস্ত সদৃশ সারি আপনাকে ফিরিয়ে দেবে।

ডকুমেন্টেশন অনুযায়ী :

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

  • প্রথম: প্রথম উপস্থিতি ব্যতীত সত্য হিসাবে সদৃশ চিহ্নিত করুন।
  • শেষ: শেষ ঘটনাটি বাদে সত্য হিসাবে সদৃশ হিসাবে চিহ্নিত করুন।
  • মিথ্যা: সমস্ত সদৃশ সত্য হিসাবে চিহ্নিত করুন।

@ ড্রিম এটি সিনট্যাটিকভাবে সঠিক নয়, এটিও কাজ করে না। মেলে না ']' এবং এটি তাদের যা প্রয়োজন তা ফিরিয়ে দেয় না। এটি সংক্ষিপ্ত, তবে ভুল।
ফিনান্সিয়ালড্যাড

ওফস, আপনি উভয়ই পরিসংখ্যান থেকে ঠিক @ ফিনান্সিয়ালআরড ডেভেলপার। আমি আমার মন্তব্য মুছে ফেলব। ত্রুটি বাছাই করার জন্য ধন্যবাদ।
ড্রিম

3
df [df ['ID']। নকল () == সত্য] এটি সমস্ত অনুলিপি ফিরিয়ে দেবে
হরিপ্রসাদ

12

যেহেতু আমি মন্তব্য করতে অক্ষম, তাই আলাদা উত্তর হিসাবে পোস্ট করছি

একাধিক কলামের ভিত্তিতে সদৃশ সন্ধান করতে নীচের মতো প্রতিটি কলামের নাম উল্লেখ করুন এবং এটি আপনাকে সমস্ত নকল সারি সেট করে দেবে:

df[df[['product_uid', 'product_title', 'user']].duplicated() == True]


3

কোনও উপাদান-ভিত্তিক যৌক্তিক ব্যবহার করে এবং এবং সত্য এবং মিথ্যা উভয়কেই প্যান্ডাস সদৃশ পদ্ধতির টেক_স্ট আর্গুমেন্ট সেট করে আপনি আপনার ডেটাফ্রেমে একটি সেট পেতে পারেন যার মধ্যে সমস্ত নকল রয়েছে।

df_bigdata_duplicates = 
    df_bigdata[df_bigdata.duplicated(cols='ID', take_last=False) |
               df_bigdata.duplicated(cols='ID', take_last=True)
              ]

2

এটি প্রশ্নের সমাধান হতে পারে না, তবে উদাহরণ উদাহরণ দিয়ে:

import pandas as pd

df = pd.DataFrame({
    'A': [1,1,3,4],
    'B': [2,2,5,6],
    'C': [3,4,7,6],
})

print(df)
df.duplicated(keep=False)
df.duplicated(['A','B'], keep=False)

ফলাফল:

   A  B  C
0  1  2  3
1  1  2  4
2  3  5  7
3  4  6  6

0    False
1    False
2    False
3    False
dtype: bool

0     True
1     True
2    False
3    False
dtype: bool

2

sort("ID")এখন কাজ করছে বলে মনে হচ্ছে না, সাজানো ডক অনুসারে অবচয় বলে মনে হচ্ছে , সুতরাং sort_values("ID")সদৃশ ফিল্টার পরে বাছাইয়ের পরিবর্তে নিম্নলিখিতটি ব্যবহার করুন:

df[df.ID.duplicated(keep=False)].sort_values("ID")

2

আমার ডাটাবেসের সদৃশ হয়ে গেছে (কলাম = মিথ্যা) কলামটি বাছাই না করা পর্যন্ত কাজ করে না।

data.sort_values(by=['Order ID'], inplace=True)
df = data[data['Order ID'].duplicated(keep=False)]

1

df[df.duplicated(['ID'])==True].sort_values('ID')


4
দয়া করে, আপনি আরও বিস্তারিত ব্যাখ্যা দিয়ে আপনার উত্তরটি প্রসারিত করতে পারেন? এটি বোঝার জন্য খুব দরকারী হবে। ধন্যবাদ!
vezunchik

স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম এবং আপনার অবদানের জন্য ধন্যবাদ! আপনি যদি কোনও ব্যাখ্যা দিয়ে উত্তরটি প্রসারিত করতে পারেন তবে তা দয়া হবে। কিভাবে আপনি একটি ভাল উত্তর দিতে হয় এখানে একটি গাইড পাবেন । ধন্যবাদ!
ডেভিড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.