দুটি ডেটা ফ্রেমের তুলনা করুন এবং পাশাপাশি তাদের পার্থক্যগুলি আউটপুট করুন


162

আমি দুটি ডেটাফ্রেমের মধ্যে ঠিক কী পরিবর্তিত হয়েছে তা হাইলাইট করার চেষ্টা করছি।

ধরুন আমার কাছে দুটি পাইথন পান্ডাস ডেটাফ্রেম রয়েছে:

"StudentRoster Jan-1":
id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.11                     False                Graduated
113  Zoe    4.12                     True       

"StudentRoster Jan-2":
id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.21                     False                Graduated
113  Zoe    4.12                     False                On vacation

আমার লক্ষ্য একটি এইচটিএমএল টেবিল আউটপুট করা যা:

  1. যে সারিগুলি পরিবর্তিত হয়েছে তা সনাক্ত করে (অন্তর্নিহিত, ভাসমান, বুলিয়ান, স্ট্রিং হতে পারে)
  2. একই, ওএলডি এবং নতুন মানগুলির সাথে আউটপুট সারিগুলি (আদর্শভাবে একটি এইচটিএমএল টেবিলের মধ্যে) যাতে গ্রাহক পরিষ্কারভাবে দেখতে পান যে দুটি ডেটাফ্রেমের মধ্যে কী পরিবর্তন হয়েছে:

    "StudentRoster Difference Jan-1 - Jan-2":  
    id   Name   score                    isEnrolled           Comment
    112  Nick   was 1.11| now 1.21       False                Graduated
    113  Zoe    4.12                     was True | now False was "" | now   "On   vacation"

আমি মনে করি আমি কলামের তুলনায় সারি এবং কলাম দ্বারা একটি সারি করতে পারলাম, তবে এর চেয়ে সহজ উপায় কি আছে?


পান্ডাস ১.১ থেকে আপনি সহজেই এটি একক ফাংশন কলdf.compare দিয়ে করতে পারেন -
সিএস 95

উত্তর:


153

প্রথম অংশটি কনস্টানটাইন এর সমান, আপনি যে বুলিয়ানগুলির সারি খালি পেয়েছেন তা বুলিয়ান পেতে পারেন:

In [21]: ne = (df1 != df2).any(1)

In [22]: ne
Out[22]:
0    False
1     True
2     True
dtype: bool

তারপরে আমরা দেখতে পাচ্ছি কোন প্রবেশিকা পরিবর্তন হয়েছে:

In [23]: ne_stacked = (df1 != df2).stack()

In [24]: changed = ne_stacked[ne_stacked]

In [25]: changed.index.names = ['id', 'col']

In [26]: changed
Out[26]:
id  col
1   score         True
2   isEnrolled    True
    Comment       True
dtype: bool

এখানে প্রথম এন্ট্রিটি সূচক এবং দ্বিতীয়টি কলামগুলি পরিবর্তন করা হয়েছে।

In [27]: difference_locations = np.where(df1 != df2)

In [28]: changed_from = df1.values[difference_locations]

In [29]: changed_to = df2.values[difference_locations]

In [30]: pd.DataFrame({'from': changed_from, 'to': changed_to}, index=changed.index)
Out[30]:
               from           to
id col
1  score       1.11         1.21
2  isEnrolled  True        False
   Comment     None  On vacation

* দ্রষ্টব্য: এটি গুরুত্বপূর্ণ df1এবং df2এখানে একই সূচকটি ভাগ করুন। এই অস্পষ্টতা কাটিয়ে ওঠার জন্য, আপনি এটি ব্যবহার করে কেবলমাত্র ভাগ করা লেবেলগুলিই দেখেছেন তা নিশ্চিত করতে পারেন df1.index & df2.indexতবে আমি মনে করি এটি আমি অনুশীলন হিসাবে ছেড়ে দেব।


2
আমি বিশ্বাস করি "একই সূচকটি ভাগ করুন" এর অর্থ "সূচকটি সাজানো হয়েছে তা নিশ্চিত করুন" ... এটি সূচকের মান নির্বিশেষে df1প্রথমে যা আছে তার সাথে যা কিছু আছে তার সাথে তুলনা করবে df2। JFYI ক্ষেত্রে আমি একমাত্র ব্যক্তি নই যার পক্ষে এটি সুস্পষ্ট ছিল না। ; ডি ধন্যবাদ!
dmn

12
তাহলে স্কোর সমান nanউভয় df1 এবং df1 এ, এই ফাংশন থেকে পরিবর্তিত হচ্ছে যেমন রিপোর্ট হবে nanথেকে nan। এ কারণে যে np.nan != np.nanআয় True
জেমস ওনার্স

2
@ কুংফুজাম ঠিক আছে। এছাড়াও, তুলনা করা মানগুলি যদি কোনও না হয় তবে আপনিও সেখানে ভুল পার্থক্য পাবেন
FistOfFury

কেবল স্পষ্ট করে বলার জন্য - আমি এই সমাধানটি দিয়ে বিষয়টি চিত্রিত করেছি এবং নীচে
জেমস ওনার্স

1
['সারি', 'কল'] পরিবর্তিত.আইডেক্স.নাম হিসাবে ['আইডি', 'কল'] এর চেয়ে পছন্দনীয়, কারণ এটি আইডি নয়, তবে সারিগুলি।
নওকি ফুজিটা

87

দুটি ডেটা ফ্রেমের মধ্যে পার্থক্য তুলে ধরে

যেখানে কোনও পার্থক্য রয়েছে সেগুলির পটভূমির রঙটি হাইলাইট করার জন্য ডেটা ফ্রেম স্টাইলের বৈশিষ্ট্যটি ব্যবহার করা সম্ভব।

মূল প্রশ্ন থেকে উদাহরণস্বরূপ ডেটা ব্যবহার করা

প্রথম পদক্ষেপটি হ'ল ডেটাফ্রেমগুলিকে concatফাংশনের সাথে অনুভূমিকভাবে যুক্ত করা এবং প্রতিটি ফ্রেমকে keysপ্যারামিটারের সাথে পৃথক করা:

df_all = pd.concat([df.set_index('id'), df2.set_index('id')], 
                   axis='columns', keys=['First', 'Second'])
df_all

এখানে চিত্র বর্ণনা লিখুন

কলাম স্তরের অদলবদল করা এবং একই কলামের নাম একে অপরের পাশে রাখা সম্ভবত এটি সহজ:

df_final = df_all.swaplevel(axis='columns')[df.columns[1:]]
df_final

এখানে চিত্র বর্ণনা লিখুন

এখন, ফ্রেমগুলির মধ্যে পার্থক্যগুলি চিহ্নিত করা এটি আরও সহজ। তবে, আমরা আরও এগিয়ে যেতে পারি এবং styleআলাদা আলাদা ঘরগুলি হাইলাইট করতে সম্পত্তিটি ব্যবহার করতে পারি । এটি করার জন্য আমরা একটি কাস্টম ফাংশন সংজ্ঞায়িত করেছি যা আপনি নথির এই অংশে দেখতে পারেন ।

def highlight_diff(data, color='yellow'):
    attr = 'background-color: {}'.format(color)
    other = data.xs('First', axis='columns', level=-1)
    return pd.DataFrame(np.where(data.ne(other, level=0), attr, ''),
                        index=data.index, columns=data.columns)

df_final.style.apply(highlight_diff, axis=None)

এখানে চিত্র বর্ণনা লিখুন

এটি উভয়ই মূল্যবোধ হারিয়েছে এমন ঘরগুলি হাইলাইট করবে। আপনি সেগুলি পূরণ করতে পারেন বা অতিরিক্ত যুক্তি সরবরাহ করতে পারেন যাতে তারা হাইলাইট না হয়।


1
'ফার্স্ট' এবং 'সেকেন্ড' উভয়কে বিভিন্ন রঙে রঙ করা কীভাবে আপনি জানেন?
আতরেগানো

1
কেবল ভিন্ন সারিটি নির্বাচন করা কি সম্ভব? এই ক্ষেত্রে আমি প্রথম সারি (111) নির্বাচন না করে দ্বিতীয় এবং তৃতীয় সারিটি কীভাবে নির্বাচন করব?
শান্তানুও

1
@shantanuo, হ্যাঁ, শুধু চূড়ান্ত পদ্ধতি সম্পাদনাdf_final[(df != df2).any(1)].style.apply(highlight_diff, axis=None)
anmol

3
26K সারি এবং 400 কলামের সাথে ডেটা ফ্রেমগুলির তুলনা করার সময় এই বাস্তবায়নটি আরও বেশি সময় নিচ্ছে। এটির গতি বাড়ানোর কোনও উপায় আছে কি?
কোডসর্ড

42

এই উত্তরটি কেবলমাত্র অ্যান্ডি হেইডেনকে প্রসারিত করে, সংখ্যা ক্ষেত্রগুলি কখন তা স্থিতিশীল করে তোলে এবং এটিকে nanকোনও কার্যক্রমে সংযুক্ত করে।

import pandas as pd
import numpy as np


def diff_pd(df1, df2):
    """Identify differences between two pandas DataFrames"""
    assert (df1.columns == df2.columns).all(), \
        "DataFrame column names are different"
    if any(df1.dtypes != df2.dtypes):
        "Data Types are different, trying to convert"
        df2 = df2.astype(df1.dtypes)
    if df1.equals(df2):
        return None
    else:
        # need to account for np.nan != np.nan returning True
        diff_mask = (df1 != df2) & ~(df1.isnull() & df2.isnull())
        ne_stacked = diff_mask.stack()
        changed = ne_stacked[ne_stacked]
        changed.index.names = ['id', 'col']
        difference_locations = np.where(diff_mask)
        changed_from = df1.values[difference_locations]
        changed_to = df2.values[difference_locations]
        return pd.DataFrame({'from': changed_from, 'to': changed_to},
                            index=changed.index)

সুতরাং আপনার ডেটা দিয়ে (স্কোর কলামে একটি NaN রাখতে সামান্য সম্পাদিত):

import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO

DF1 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.11                     False                "Graduated"
113  Zoe    NaN                     True                  " "
""")
DF2 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.21                     False                "Graduated"
113  Zoe    NaN                     False                "On vacation" """)
df1 = pd.read_table(DF1, sep='\s+', index_col='id')
df2 = pd.read_table(DF2, sep='\s+', index_col='id')
diff_pd(df1, df2)

আউটপুট:

                from           to
id  col                          
112 score       1.11         1.21
113 isEnrolled  True        False
    Comment           On vacation

আমি ডেটাটাইপের সামান্য পার্থক্যের যত্ন নিতে কোড যুক্ত করেছি, যা যদি আপনি অ্যাকাউন্ট না করেন তবে কোনও ত্রুটি ঘটবে throw
রুবি নবি

আমার যদি তুলনা করার জন্য উভয় পাশে অভিন্ন সারি না থাকে?
কিশোর কুমার আর

@ কিশোরকুমারআর তখন আপনার নতুন সারণিগুলি সরিয়ে নেওয়া উচিত, নতুন ডেটাফ্রেমে যুক্ত সারিগুলি সনাক্ত করে এবং পুরাতন ডেটাফ্রেম থেকে সারিগুলি সরিয়ে নেওয়া উচিত
সাবের

22
import pandas as pd
import io

texts = ['''\
id   Name   score                    isEnrolled                        Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.11                     False                           Graduated
113  Zoe    4.12                     True       ''',

         '''\
id   Name   score                    isEnrolled                        Comment
111  Jack   2.17                     True                 He was late to class
112  Nick   1.21                     False                           Graduated
113  Zoe    4.12                     False                         On vacation''']


df1 = pd.read_fwf(io.StringIO(texts[0]), widths=[5,7,25,21,20])
df2 = pd.read_fwf(io.StringIO(texts[1]), widths=[5,7,25,21,20])
df = pd.concat([df1,df2]) 

print(df)
#     id  Name  score isEnrolled               Comment
# 0  111  Jack   2.17       True  He was late to class
# 1  112  Nick   1.11      False             Graduated
# 2  113   Zoe   4.12       True                   NaN
# 0  111  Jack   2.17       True  He was late to class
# 1  112  Nick   1.21      False             Graduated
# 2  113   Zoe   4.12      False           On vacation

df.set_index(['id', 'Name'], inplace=True)
print(df)
#           score isEnrolled               Comment
# id  Name                                        
# 111 Jack   2.17       True  He was late to class
# 112 Nick   1.11      False             Graduated
# 113 Zoe    4.12       True                   NaN
# 111 Jack   2.17       True  He was late to class
# 112 Nick   1.21      False             Graduated
# 113 Zoe    4.12      False           On vacation

def report_diff(x):
    return x[0] if x[0] == x[1] else '{} | {}'.format(*x)

changes = df.groupby(level=['id', 'Name']).agg(report_diff)
print(changes)

কপি করে প্রিন্ট

                score    isEnrolled               Comment
id  Name                                                 
111 Jack         2.17          True  He was late to class
112 Nick  1.11 | 1.21         False             Graduated
113 Zoe          4.12  True | False     nan | On vacation

3
খুব সুন্দর সমাধান, আমার যে আরও কমপ্যাক্ট!
অ্যান্ডি হেডেন

1
@ অ্যান্ডি হেডেন: আমি এই সমাধানটিতে সম্পূর্ণ আরামদায়ক নই; সূচকটি মাল্টিলেভাল সূচক হলেই এটি কাজ করবে বলে মনে হয়। আমি যদি কেবল idসূচক হিসাবে ব্যবহার করার চেষ্টা করি তবে df.groupby(level='id')একটি ত্রুটি উত্থাপন করে এবং কেন আমি নিশ্চিত নই ...
আনুতবু

19

আমি এই সমস্যার মুখোমুখি হয়েছি, তবে এই পোস্টটি সন্ধান করার আগে একটি উত্তর পেয়েছি:

আনটবুর উত্তরের ভিত্তিতে, আপনার ডেটা লোড করুন ...

import pandas as pd
import io

texts = ['''\
id   Name   score                    isEnrolled                       Date
111  Jack                            True              2013-05-01 12:00:00
112  Nick   1.11                     False             2013-05-12 15:05:23
     Zoe    4.12                     True                                  ''',

         '''\
id   Name   score                    isEnrolled                       Date
111  Jack   2.17                     True              2013-05-01 12:00:00
112  Nick   1.21                     False                                
     Zoe    4.12                     False             2013-05-01 12:00:00''']


df1 = pd.read_fwf(io.StringIO(texts[0]), widths=[5,7,25,17,20], parse_dates=[4])
df2 = pd.read_fwf(io.StringIO(texts[1]), widths=[5,7,25,17,20], parse_dates=[4])

... আপনার ভিন্ন কার্যটি সংজ্ঞায়িত করুন ...

def report_diff(x):
    return x[0] if x[0] == x[1] else '{} | {}'.format(*x)

তারপরে আপনি উপসংহারে কেবল প্যানেলটি ব্যবহার করতে পারেন:

my_panel = pd.Panel(dict(df1=df1,df2=df2))
print my_panel.apply(report_diff, axis=0)

#          id  Name        score    isEnrolled                       Date
#0        111  Jack   nan | 2.17          True        2013-05-01 12:00:00
#1        112  Nick  1.11 | 1.21         False  2013-05-12 15:05:23 | NaT
#2  nan | nan   Zoe         4.12  True | False  NaT | 2013-05-01 12:00:00

যাইহোক, আপনি আইপিথন নোটবুকে থাকলে, কোষগুলি আলাদা, সমান বা বাম / ডান নাল কিনা তা নির্ভর করে রঙ দেওয়ার জন্য আপনি রঙিন ডিফ ফাংশন ব্যবহার করতে পছন্দ করতে পারেন :

from IPython.display import HTML
pd.options.display.max_colwidth = 500  # You need this, otherwise pandas
#                          will limit your HTML strings to 50 characters

def report_diff(x):
    if x[0]==x[1]:
        return unicode(x[0].__str__())
    elif pd.isnull(x[0]) and pd.isnull(x[1]):
        return u'<table style="background-color:#00ff00;font-weight:bold;">'+\
            '<tr><td>%s</td></tr><tr><td>%s</td></tr></table>' % ('nan', 'nan')
    elif pd.isnull(x[0]) and ~pd.isnull(x[1]):
        return u'<table style="background-color:#ffff00;font-weight:bold;">'+\
            '<tr><td>%s</td></tr><tr><td>%s</td></tr></table>' % ('nan', x[1])
    elif ~pd.isnull(x[0]) and pd.isnull(x[1]):
        return u'<table style="background-color:#0000ff;font-weight:bold;">'+\
            '<tr><td>%s</td></tr><tr><td>%s</td></tr></table>' % (x[0],'nan')
    else:
        return u'<table style="background-color:#ff0000;font-weight:bold;">'+\
            '<tr><td>%s</td></tr><tr><td>%s</td></tr></table>' % (x[0], x[1])

HTML(my_panel.apply(report_diff, axis=0).to_html(escape=False))

(নিয়মিত পাইথনে, আইপিথন নোটবুক নয়) my_panel = pd.Panel(dict(df1=df1,df2=df2))ফাংশনের অভ্যন্তরে অন্তর্ভুক্ত করা কি সম্ভব report_diff()? মানে, এটি করা কি সম্ভব: print report_diff(df1,df2)এবং আপনার মুদ্রণ বিবৃতি হিসাবে একই আউটপুট পাবেন?
এডেজ

pd.Panel(dict(df1=df1,df2=df2)).apply(report_diff, axis=0)- এটা সত্যিই দারুন!!!
ম্যাকসু

5
প্যানেলগুলি হ্রাস করা হয়! এই পোর্ট কিভাবে কোন ধারণা?
denfromufa

@ এডনফ্রোমুফা আমি আমার উত্তরে এটি আপডেট করে একটি দোল নিয়েছি: stackoverflow.com/a/49038417/7607701
অ্যারন এন

9

যদি আপনার দুটি ডেটাফ্রেমে একই আইডস থাকে, তবে কী পরিবর্তিত হয়েছে তা সন্ধান করা আসলে বেশ সহজ। কেবল করা frame1 != frame2আপনাকে একটি বুলিয়ান Trueডেটা ফ্রেম দেবে যেখানে প্রতিটি ডেটা পরিবর্তিত হয়েছে। এর থেকে, আপনি সহজেই প্রতিটি পরিবর্তিত সারির সূচকটি পেতে পারেন changedids = frame1.index[np.any(frame1 != frame2,axis=1)]


6

কনক্যাট এবং ড্রপ_ ডুপ্লিকেট ব্যবহার করে একটি ভিন্ন পদ্ধতির:

import sys
if sys.version_info[0] < 3:
    from StringIO import StringIO
else:
    from io import StringIO
import pandas as pd

DF1 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.11                     False                "Graduated"
113  Zoe    NaN                     True                  " "
""")
DF2 = StringIO("""id   Name   score                    isEnrolled           Comment
111  Jack   2.17                     True                 "He was late to class"
112  Nick   1.21                     False                "Graduated"
113  Zoe    NaN                     False                "On vacation" """)

df1 = pd.read_table(DF1, sep='\s+', index_col='id')
df2 = pd.read_table(DF2, sep='\s+', index_col='id')
#%%
dictionary = {1:df1,2:df2}
df=pd.concat(dictionary)
df.drop_duplicates(keep=False)

আউটপুট:

       Name  score isEnrolled      Comment
  id                                      
1 112  Nick   1.11      False    Graduated
  113   Zoe    NaN       True             
2 112  Nick   1.21      False    Graduated
  113   Zoe    NaN      False  On vacation

3

@ জার্নোয়েসের উত্তরটি নিয়ে ঘোরাফেরা করার পরে, আমি প্যানেলের বর্ণনার কারণে প্যানেলের পরিবর্তে মাল্টিআইএনডেক্স ব্যবহার করে এটি পেতে সক্ষম হয়েছি

প্রথমে কিছু ডামি ডেটা তৈরি করুন:

df1 = pd.DataFrame({
    'id': ['111', '222', '333', '444', '555'],
    'let': ['a', 'b', 'c', 'd', 'e'],
    'num': ['1', '2', '3', '4', '5']
})
df2 = pd.DataFrame({
    'id': ['111', '222', '333', '444', '666'],
    'let': ['a', 'b', 'c', 'D', 'f'],
    'num': ['1', '2', 'Three', '4', '6'],
})

তারপর, আপনার সংজ্ঞায়িত পরিবর্তন ফাংশন, এই ক্ষেত্রে আমি তার উত্তর থেকে এক ব্যবহার করব report_diffথাকার বিষয়টি মতেই একই:

def report_diff(x):
    return x[0] if x[0] == x[1] else '{} | {}'.format(*x)

তারপরে, আমি একটি মাল্টিআইএনডেক্স ডেটাফ্রেমে ডেটাটি যুক্ত করতে যাচ্ছি:

df_all = pd.concat(
    [df1.set_index('id'), df2.set_index('id')], 
    axis='columns', 
    keys=['df1', 'df2'],
    join='outer'
)
df_all = df_all.swaplevel(axis='columns')[df1.columns[1:]]

এবং পরিশেষে আমি report_diffপ্রতিটি কলামের গোষ্ঠীটি নীচে প্রয়োগ করতে যাচ্ছি :

df_final.groupby(level=0, axis=1).apply(lambda frame: frame.apply(report_diff, axis=1))

এই ফলাফলগুলি:

         let        num
111        a          1
222        b          2
333        c  3 | Three
444    d | D          4
555  e | nan    5 | nan
666  nan | f    nan | 6

আর এটাই তো!


3

@ কেজির প্রসারিত উত্তর, যা ফলাফলের আরও পঠনযোগ্যতার জন্য দুর্দান্ত cool

a[a != b][np.any(a != b, axis=1)].join(pd.DataFrame('a<->b', index=a.index, columns=['a<=>b'])).join(
        b[a != b][np.any(a != b, axis=1)]
        ,rsuffix='_b', how='outer'
).fillna('')

সম্পূর্ণ বিক্ষোভের উদাহরণ:

import numpy as np, pandas as pd

a = pd.DataFrame(np.random.randn(7,3), columns=list('ABC'))
b = a.copy()
b.iloc[0,2] = np.nan
b.iloc[1,0] = 7
b.iloc[3,1] = 77
b.iloc[4,2] = 777

a[a != b][np.any(a != b, axis=1)].join(pd.DataFrame('a<->b', index=a.index, columns=['a<=>b'])).join(
        b[a != b][np.any(a != b, axis=1)]
        ,rsuffix='_b', how='outer'
).fillna('')

1

এখানে সিলেক্ট এবং মার্জ ব্যবহারের আরও একটি উপায় রয়েছে:

In [6]: # first lets create some dummy dataframes with some column(s) different
   ...: df1 = pd.DataFrame({'a': range(-5,0), 'b': range(10,15), 'c': range(20,25)})
   ...: df2 = pd.DataFrame({'a': range(-5,0), 'b': range(10,15), 'c': [20] + list(range(101,105))})


In [7]: df1
Out[7]:
   a   b   c
0 -5  10  20
1 -4  11  21
2 -3  12  22
3 -2  13  23
4 -1  14  24


In [8]: df2
Out[8]:
   a   b    c
0 -5  10   20
1 -4  11  101
2 -3  12  102
3 -2  13  103
4 -1  14  104


In [10]: # make condition over the columns you want to comapre
    ...: condition = df1['c'] != df2['c']
    ...:
    ...: # select rows from each dataframe where the condition holds
    ...: diff1 = df1[condition]
    ...: diff2 = df2[condition]


In [11]: # merge the selected rows (dataframes) with some suffixes (optional)
    ...: diff1.merge(diff2, on=['a','b'], suffixes=('_before', '_after'))
Out[11]:
   a   b  c_before  c_after
0 -4  11        21      101
1 -3  12        22      102
2 -2  13        23      103
3 -1  14        24      104

একটি বৃহত্তর স্ক্রিনশট থেকে এখানে একই জিনিস:

এখানে চিত্র বর্ণনা লিখুন


0

পান্ডাস> = 1.1: DataFrame.compare

পান্ডাস ১.১ সহ, আপনি মূলত টেড পেট্রোর আউটপুটটিকে একক ফাংশন কল দিয়ে প্রতিলিপি করতে পারেন। দস্তাবেজ থেকে নেওয়া উদাহরণ:

pd.__version__
# '1.1.0.dev0+2004.g8d10bfb6f'

df1.compare(df2)

  score       isEnrolled       Comment             
   self other       self other    self        other
1  1.11  1.21        NaN   NaN     NaN          NaN
2   NaN   NaN        1.0   0.0     NaN  On vacation

এখানে, "স্ব" বলতে এলএইচএস ডেটা ফ্রেম বোঝায়, অন্যদিকে "অন্যান্য" হ'ল আরএইচএস ডেটাফ্রেম। ডিফল্টরূপে, সমান মানগুলি NaN এর সাথে প্রতিস্থাপন করা হয় যাতে আপনি কেবল ভিন্নতার দিকে মনোযোগ দিতে পারেন। আপনি যদি সমান মানগুলিও দেখতে চান তবে ব্যবহার করুন

df1.compare(df2, keep_equal=True, keep_shape=True) 

  score       isEnrolled           Comment             
   self other       self  other       self        other
1  1.11  1.21      False  False  Graduated    Graduated
2  4.12  4.12       True  False        NaN  On vacation

আপনি ব্যবহার করে তুলনা অক্ষ পরিবর্তন করতে পারেন align_axis:

df1.compare(df2, align_axis='index')

         score  isEnrolled      Comment
1 self    1.11         NaN          NaN
  other   1.21         NaN          NaN
2 self     NaN         1.0          NaN
  other    NaN         0.0  On vacation

এটি কলাম অনুসারে পরিবর্তে সারি অনুসারে মানগুলির তুলনা করে।


দ্রষ্টব্য: পান্ডাস ১.১ এখনও পরীক্ষামূলক এবং কেবল একটি বিকাশ স্যান্ডবক্স তৈরি করে উপলব্ধ
সিএস 95

-1

একটি ফাংশন যে দুটি ডেটা ফ্রেম মধ্যে অপ্রতিসম পার্থক্য খুঁজে বের করে নিচে বাস্তবায়িত হয়: (উপর ভিত্তি করে পান্ডাস জন্য সেট পার্থক্য ) জিআইএসটি: https://gist.github.com/oneryalcin/68cf25f536a25e65f0b3c84f9c118e03

def diff_df(df1, df2, how="left"):
    """
      Find Difference of rows for given two dataframes
      this function is not symmetric, means
            diff(x, y) != diff(y, x)
      however
            diff(x, y, how='left') == diff(y, x, how='right')

      Ref: /programming/18180763/set-difference-for-pandas/40209800#40209800
    """
    if (df1.columns != df2.columns).any():
        raise ValueError("Two dataframe columns must match")

    if df1.equals(df2):
        return None
    elif how == 'right':
        return pd.concat([df2, df1, df1]).drop_duplicates(keep=False)
    elif how == 'left':
        return pd.concat([df1, df2, df2]).drop_duplicates(keep=False)
    else:
        raise ValueError('how parameter supports only "left" or "right keywords"')

উদাহরণ:

df1 = pd.DataFrame(d1)
Out[1]: 
                Comment  Name  isEnrolled  score
0  He was late to class  Jack        True   2.17
1             Graduated  Nick       False   1.11
2                         Zoe        True   4.12


df2 = pd.DataFrame(d2)

Out[2]: 
                Comment  Name  isEnrolled  score
0  He was late to class  Jack        True   2.17
1           On vacation   Zoe        True   4.12

diff_df(df1, df2)
Out[3]: 
     Comment  Name  isEnrolled  score
1  Graduated  Nick       False   1.11
2              Zoe        True   4.12

diff_df(df2, df1)
Out[4]: 
       Comment Name  isEnrolled  score
1  On vacation  Zoe        True   4.12

# This gives the same result as above
diff_df(df1, df2, how='right')
Out[22]: 
       Comment Name  isEnrolled  score
1  On vacation  Zoe        True   4.12

-1

পিডি হিসাবে এনপি হিসাবে আমদানি করুন পান্ডা আমদানি করুন

ডিএফ = পিডি.ড্রেড_এক্সেল ('ডি: AR হরিশ \ ডেটা বিজ্ঞান \ 1 আমার প্রশিক্ষণ ATA নমুনা ডেটা এবং প্রকল্পসমূহ IC ক্রিকেট ডেটা \ আইপিএল প্লেয়ারের তালিকা \ আইপিএল প্লেয়ার তালিকা _ হরিশ.এক্সলসেক্স')

ডিএফ 1 = এসআরএইচ = ডিএফ [ডিএফ ['টিম']

srh = srh.iloc [:, 0: 2] সিএসকি = সিএসকি.ইলোক [:, 0: 2]

csk = csk.reset_index (ড্রপ = ট্রু) সিএসকি

srh = srh.reset_index (ড্রপ = ট্রু) srh

new = pd.concat ([srh, csk], অক্ষ = 1)

new.head ()

** প্লেয়ার টাইপ প্লেয়ার টাইপ

0 ডেভিড ওয়ার্নার ব্যাটসম্যান ... এমএস ধোনি অধিনায়ক

1 ভুবনেশ্বর কুমার বোলার ... রবীন্দ্র জাদেজা অলরাউন্ডার

2 মণীশ পান্ডে ব্যাটসম্যান ... সুরেশ রায়না অলরাউন্ডার

3 রশিদ খান আরমান বোলার ... কেদার যাদব অলরাউন্ডার

4 শিখর ধাওয়ান ব্যাটসম্যান .... ডোয়াইন ব্রাভো অলরাউন্ডার


প্লেয়ার প্রকার প্লেয়ার প্রকার 0 ডেভিড ওয়ার্নার ব্যাটসম্যান মহেন্দ্র সিং ধোনি ক্যাপ্টেন 1 ভুবনেশ্বর কুমার বোলার রবীন্দ্র জাদেজা অল-রাউন্ডার 2 মনীশ পান্ডে ব্যাটসম্যান সুরেশ রায়না অলরাউন্ডার 3 রশিদ খান আরমান বোলার কেদার যাদব অল-রাউন্ডার 4 শিখর ধাওয়ান ব্যাটসম্যান ডোয়াইন ব্রাভো অল-রাউন্ডার
হরিশ ট্র্যাশ

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