İki DataFrame'i karşılaştırın ve farklarını yan yana çıktılayın


162

İki veri çerçevesi arasında tam olarak ne değiştiğini vurgulamaya çalışıyorum.

İki Python Panda veri çerçevem ​​olduğunu varsayalım:

"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

Amacım şu HTML tablosunu çıktılamaktır:

  1. Değişen satırları tanımlar (int, float, boolean, string olabilir)
  2. Aynı, OLD ve NEW değerlerine (ideal olarak bir HTML tablosuna) sahip satırlar çıktılar, böylece tüketici iki veri çerçevesi arasında nelerin değiştiğini açıkça görebilir:

    "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"
    

Sanırım bir satır satır ve sütun sütun karşılaştırma yapabilirim, ama daha kolay bir yolu var mı?


Panda 1.1'den bunu tek bir işlev çağrısıdf.compare ile kolayca yapabilirsiniz - .
cs95

Yanıtlar:


153

İlk bölüm Konstantin'e benzer, satırların boş olduğu boole'yi elde edebilirsiniz *:

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

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

Ardından hangi girişlerin değiştiğini görebiliriz:

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

Burada ilk girdi dizin, ikincisi değiştirilen sütunlardır.

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

* Not: Burada aynı dizini paylaşmak df1ve df2paylaşmak önemlidir . Bu belirsizliğin üstesinden gelmek için, yalnızca paylaşılan etiketlere kullanarak bakmanızı sağlayabilirsiniz df1.index & df2.index, ancak bence bunu bir egzersiz olarak bırakacağım.


2
Ben "index sıralanır emin olun" araçları "Aynı endeks paylaşan" inanmak ... Bu ilk ne olursa olsun karşılaştırır df1ilk ne varsa için df2bakılmaksızın endeksi değerinin,. JFYI, bunun açık olmadığı tek kişi olmamam durumunda. ; D Teşekkürler!
dmn

12
Skor eşitse nandf1 ve df1 hem de bu işlev değiştirildi yaşadığını belirtti rapor edecektir nanetmek nan. Bunun nedeni np.nan != np.nangeri dönüşlerdir True.
James Owers

2
@kungfujam haklı. Ayrıca, karşılaştırılan değerler Yok ise, orada da yanlış farklar elde edersiniz
FistOfFury

Açık olmak gerekirse - Bu çözümle ilgili sorunu
açıklarım

1
['row', 'col'], değişti.index.names olarak ['id', 'col'] 'den daha fazla tercih edilir, çünkü ids değil satırlar.
naoki fujita

88

İki DataFrame arasındaki farkı vurgulama

Bir farkın olduğu hücrelerin arka plan rengini vurgulamak için DataFrame stil özelliğini kullanmak mümkündür.

Orijinal sorudaki örnek verileri kullanma

İlk adım DataFrames işleviyle yatay olarak birleştirmek concatve her kareyi keysparametre ile ayırt etmektir :

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

resim açıklamasını buraya girin

Sütun düzeylerini değiştirmek ve aynı sütun adlarını yan yana koymak muhtemelen daha kolaydır:

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

resim açıklamasını buraya girin

Şimdi, çerçevelerdeki farkları tespit etmek çok daha kolay. Ancak, daha ileri gidebilir ve styleözelliği farklı hücreleri vurgulamak için kullanabiliriz . Bunu yapmak için, belgelerin bu bölümünde görebileceğiniz özel bir işlev tanımlarız .

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)

resim açıklamasını buraya girin

Bu, her ikisinin de eksik değerleri olan hücreleri vurgulayacaktır. Vurgulanmamaları için onları doldurabilir veya ekstra mantık sağlayabilirsiniz.


1
Hem 'İlk' hem de 'İkinci'yi farklı renklerde renklendirmenin mümkün olup olmadığını biliyor musunuz?
aturegano

1
Yalnızca farklı satırlar seçmek mümkün müdür? Bu durumda, birinci satırı (111) seçmeden ikinci ve üçüncü satırı nasıl seçerim?
shantanuo

1
@shantanuo, evet, sadece son yöntemi düzenledf_final[(df != df2).any(1)].style.apply(highlight_diff, axis=None)
anmol

3
26K satır ve 400 sütun ile veri çerçeveleri karşılaştırıldığında bu uygulama daha uzun zaman alıyor. Hızlandırmanın bir yolu var mı?
codeslord

42

Bu cevap basitçe @Andy Hayden's'ı genişleterek sayısal alanların ne zaman esnek olduğunu nanve bir işleve tamamladığını gösterir.

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)

Yani verilerinizle (skor sütununda bir NaN olması için biraz düzenlenmiştir):

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)

Çıktı:

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

Veri türündeki küçük farkları gözetmek için kod ekledim, ki bu hesaba katılmamış olsaydınız bir hata fırlatacaktı.
Roobie Nuby

Karşılaştırılacak iki tarafta da aynı satırlar yoksa ne olur?
Kishor kumar R

@KishorkumarR daha sonra, yeni veri çerçevesine eklenen satırları tespit ederek ve eski veri çerçevesinden satırları kaldırarak ilk önce satırları bile çıkarmalısınız
Sabre

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)

baskılar

                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
Çok güzel bir çözüm, benimkinden çok daha kompakt!
Andy Hayden

1
@AndyHayden: Bu çözümden tamamen rahat değilim; yalnızca dizin çok düzeyli bir dizin olduğunda işe yarar. Yalnızca iddizin olarak kullanmayı df.groupby(level='id')
denersem

19

Bu sorunla karşılaştım, ancak bu yazıyı bulmadan önce bir cevap buldum:

Unutbu'nun cevabına dayanarak verilerinizi yükleyin ...

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])

... fark fonksiyonunuzu tanımlayın ...

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

Ardından şu sonuca varmak için bir Panel kullanabilirsiniz:

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

Bu arada, IPython Not Defteri'ndeyseniz, hücrelerin farklı, eşit veya sol / sağ boş olmasına bağlı olarak renk vermek için renkli bir fark işlevi kullanmak isteyebilirsiniz :

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))

(Normal Python'da, iPython notebook değil) my_panel = pd.Panel(dict(df1=df1,df2=df2))fonksiyonun içine dahil etmek mümkün report_diff()mü? Demek istediğim, bunu yapmak mümkün print report_diff(df1,df2)mü : ve baskı beyanınızla aynı çıktıyı elde etmek mi?
edesz

pd.Panel(dict(df1=df1,df2=df2)).apply(report_diff, axis=0)- Bu harika !!!
17'de MaxU

5
Paneller kullanımdan kaldırıldı! Bunu nasıl taşıyacağına dair bir fikrin var mı?
denfromufa

@denfromufa Cevabımda güncellerken bir salıncak aldım: stackoverflow.com/a/49038417/7607701
Aaron N. Brock

9

İki veri çerçevenizde aynı kimlikler varsa, neyin değiştiğini bulmak aslında oldukça kolaydır. Sadece yapmak frame1 != frame2size her Truebirinin değişen veriler olduğu bir boolean DataFrame verecektir . Bundan sonra, değiştirilen her satırın dizinini yaparak kolayca alabilirsiniz changedids = frame1.index[np.any(frame1 != frame2,axis=1)].


6

Concat ve drop_duplicates kullanan farklı bir yaklaşım:

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)

Çıktı:

       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

Journois cevabı @ ile ilgilenmek sonra nedeniyle yerine Panel MultiIndex kullanarak işe almak başardı Panelin amortismanlar .

İlk olarak, bazı sahte veriler oluşturun:

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'],
})

Daha sonra fark fonksiyonunuzu tanımlayın , bu durumda cevabından report_diffaynı olanı kullanacağım :

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

Ardından, verileri bir MultiIndex veri çerçevesine birleştireceğim:

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:]]

Ve sonunda report_diffher sütun grubunu uygulayacağım :

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

Bu çıktılar:

         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

Ve hepsi bu!


3

Sonucun daha okunabilir olması için oldukça iyi olan @cge'nin cevabı genişletiliyor:

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('')

Tam tanıtım örneği:

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

İşte select ve merge kullanmanın başka bir yolu:

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

İşte aynı şey bir Jupyter ekran görüntüsünden:

resim açıklamasını buraya girin


0

pandalar> = 1.1: DataFrame.compare

Pandalar 1.1 ile Ted Petrou'nun çıktısını tek bir işlev çağrısıyla çoğaltabilirsiniz. Dokümanlardan alınan örnek:

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

Burada "self", LHS dataFrame'i belirtirken "other", RHS DataFrame'dir. Varsayılan olarak, eşit değerler NaN'lerle değiştirilir, böylece yalnızca farklara odaklanabilirsiniz. Eşit değerleri de göstermek istiyorsanız şunu kullanın:

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

Karşılaştırma eksenini aşağıdakileri kullanarak da değiştirebilirsiniz 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

Bu, sütun bazında değerleri satır bazında karşılaştırır.


Not: panda 1.1 hala deneyseldir ve yalnızca bir geliştirme sanal alanı oluşturarak kullanılabilir .
cs95

-1

İki veri çerçevesi arasında asimetrik fark bulan bir işlev aşağıda uygulanmaktadır: ( Pandalar için ayarlanan farka bağlı olarak ) GIST: 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"')

Misal:

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

pandaları pd olarak içe aktar np olarak numpy'yi içe aktar

df = pd.read_excel ('D: \ HARISH \ DATA SCIENCE \ 1 Eğitimim \ ÖRNEK VERİ & projeksiyon \ CRICKET DATA \ IPL PLAYER LIST \ IPL PLAYER LIST _ harish.xlsx')

df1 = srh = df [df ['TEAM']. str.contains ("SRH")] df2 = csk = df [df ['TEAM']. str.contains ("CSK")]

srh = srh.iloc [:, 0: 2] csk = csk.iloc [:, 0: 2]

csk = csk.reset_index (damla = Doğru) csk

srh = srh.reset_index (drop = True) srh

yeni = pd.concat ([srh, csk], eksen = 1)

new.head ()

** OYUNCU TÜRÜ OYUNCU TÜRÜ

0 David Warner Batsman ... MS Dhoni Kaptan

1 Bhuvaneshwar Kumar Bowler ... Ravindra Jadeja Çok Yönlü

2 Manish Pandey Batsman ... Suresh Raina Çok Yönlü

3 Rashid Khan Arman Bowler ... Çok Yönlü Kedar Jadhav

4 Shikhar Dhawan Batsman .... Dwayne Bravo Çok Yönlü


OYUNCU TÜRÜ OYUNCU TÜRÜ 0 David Warner Batsman MS Dhoni Kaptan 1 Bhuvaneshwar Kumar Bowler Ravindra Jadeja Çok Yönlü 2 Manish Pandey Batsman Suresh Raina Çok Yönlü 3 Rashid Khan Arman Bowler Kedar Jadhav Çok
Yönlü

Merhaba Harish, lütfen cevabınızı biraz daha biçimlendirin, aksi takdirde okumak oldukça zor :)
Markus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.