Python Pandas Kullanıcı Uyarısı: Birleştirme olmayan eksen hizalı olmadığı için sıralama


93

Bazı kod alıştırmaları yapıyorum ve bunu yaparken kullanıcı uyarısı alırken veri çerçevelerini birleştiriyorum

/usr/lib64/python2.7/site-packages/pandas/core/frame.py:6201: FutureWarning: Birleştirme olmayan eksen hizalı olmadığı için sıralama. Pandaların gelecekteki bir sürümü varsayılan olarak sıralanmayacak şekilde değişecektir. Gelecekteki davranışı kabul etmek için 'sort = True' iletin. Mevcut davranışı korumak ve uyarıyı susturmak için, sırala = False geçin

Bu kod satırları hakkında: Lütfen bu uyarının çözümüne yardımcı olabilir misiniz?

placement_video = [self.read_sql_vdx_summary, self.read_sql_video_km]
placement_video_summary = reduce(lambda left, right: pd.merge(left, right, on='PLACEMENT', sort=False), placement_video)


placement_by_video = placement_video_summary.loc[:, ["PLACEMENT", "PLACEMENT_NAME", "COST_TYPE", "PRODUCT",
                                                     "VIDEONAME", "VIEW0", "VIEW25", "VIEW50", "VIEW75",
                                                     "VIEW100",
                                                     "ENG0", "ENG25", "ENG50", "ENG75", "ENG100", "DPE0",
                                                     "DPE25",
                                                     "DPE50", "DPE75", "DPE100"]]

# print (placement_by_video)

placement_by_video["Placement# Name"] = placement_by_video[["PLACEMENT",
                                                            "PLACEMENT_NAME"]].apply(lambda x: ".".join(x),
                                                                                     axis=1)

placement_by_video_new = placement_by_video.loc[:,
                         ["PLACEMENT", "Placement# Name", "COST_TYPE", "PRODUCT", "VIDEONAME",
                          "VIEW0", "VIEW25", "VIEW50", "VIEW75", "VIEW100",
                          "ENG0", "ENG25", "ENG50", "ENG75", "ENG100", "DPE0", "DPE25",
                          "DPE50", "DPE75", "DPE100"]]

placement_by_km_video = [placement_by_video_new, self.read_sql_km_for_video]
placement_by_km_video_summary = reduce(lambda left, right: pd.merge(left, right, on=['PLACEMENT', 'PRODUCT'], sort=False),
                                       placement_by_km_video)

#print (list(placement_by_km_video_summary))
#print(placement_by_km_video_summary)
#exit()
# print(placement_by_video_new)
"""Conditions for 25%view"""
mask17 = placement_by_km_video_summary["PRODUCT"].isin(['Display', 'Mobile'])
mask18 = placement_by_km_video_summary["COST_TYPE"].isin(["CPE", "CPM", "CPCV"])
mask19 = placement_by_km_video_summary["PRODUCT"].isin(["InStream"])
mask20 = placement_by_km_video_summary["COST_TYPE"].isin(["CPE", "CPM", "CPE+", "CPCV"])
mask_video_video_completions = placement_by_km_video_summary["COST_TYPE"].isin(["CPCV"])
mask21 = placement_by_km_video_summary["COST_TYPE"].isin(["CPE+"])
mask22 = placement_by_km_video_summary["COST_TYPE"].isin(["CPE", "CPM"])
mask23 = placement_by_km_video_summary["PRODUCT"].isin(['Display', 'Mobile', 'InStream'])
mask24 = placement_by_km_video_summary["COST_TYPE"].isin(["CPE", "CPM", "CPE+"])

choice25video_eng = placement_by_km_video_summary["ENG25"]
choice25video_vwr = placement_by_km_video_summary["VIEW25"]
choice25video_deep = placement_by_km_video_summary["DPE25"]

placement_by_km_video_summary["25_pc_video"] = np.select([mask17 & mask18, mask19 & mask20, mask17 & mask21],
                                                  [choice25video_eng, choice25video_vwr, choice25video_deep])


"""Conditions for 50%view"""
choice50video_eng = placement_by_km_video_summary["ENG50"]
choice50video_vwr = placement_by_km_video_summary["VIEW50"]
choice50video_deep = placement_by_km_video_summary["DPE50"]

placement_by_km_video_summary["50_pc_video"] = np.select([mask17 & mask18, mask19 & mask20, mask17 & mask21],
                                                  [choice50video_eng,
                                                   choice50video_vwr, choice50video_deep])

"""Conditions for 75%view"""

choice75video_eng = placement_by_km_video_summary["ENG75"]
choice75video_vwr = placement_by_km_video_summary["VIEW75"]
choice75video_deep = placement_by_km_video_summary["DPE75"]

placement_by_km_video_summary["75_pc_video"] = np.select([mask17 & mask18, mask19 & mask20, mask17 & mask21],
                                                  [choice75video_eng,
                                                   choice75video_vwr,
                                                   choice75video_deep])

"""Conditions for 100%view"""

choice100video_eng = placement_by_km_video_summary["ENG100"]
choice100video_vwr = placement_by_km_video_summary["VIEW100"]
choice100video_deep = placement_by_km_video_summary["DPE100"]
choicecompletions = placement_by_km_video_summary['COMPLETIONS']

placement_by_km_video_summary["100_pc_video"] = np.select([mask17 & mask22, mask19 & mask24, mask17 & mask21, mask23 & mask_video_video_completions],
                                                          [choice100video_eng, choice100video_vwr, choice100video_deep, choicecompletions])



"""conditions for 0%view"""

choice0video_eng = placement_by_km_video_summary["ENG0"]
choice0video_vwr = placement_by_km_video_summary["VIEW0"]
choice0video_deep = placement_by_km_video_summary["DPE0"]

placement_by_km_video_summary["Views"] = np.select([mask17 & mask18, mask19 & mask20, mask17 & mask21],
                                                   [choice0video_eng,
                                                    choice0video_vwr,
                                                    choice0video_deep])


#print (placement_by_km_video_summary)
#exit()

#final Table

placement_by_video_summary = placement_by_km_video_summary.loc[:,
                             ["PLACEMENT", "Placement# Name", "PRODUCT", "VIDEONAME", "COST_TYPE",
                              "Views", "25_pc_video", "50_pc_video", "75_pc_video","100_pc_video",
                              "ENGAGEMENTS","IMPRESSIONS", "DPEENGAMENTS"]]

#placement_by_km_video = [placement_by_video_summary, self.read_sql_km_for_video]
#placement_by_km_video_summary = reduce(lambda left, right: pd.merge(left, right, on=['PLACEMENT', 'PRODUCT']),
                                       #placement_by_km_video)


#print(placement_by_video_summary)
#exit()
# dup_col =["IMPRESSIONS","ENGAGEMENTS","DPEENGAMENTS"]

# placement_by_video_summary.loc[placement_by_video_summary.duplicated(dup_col),dup_col] = np.nan

# print ("Dhar",placement_by_video_summary)

'''adding views based on conditions'''
#filter maximum value from videos

placement_by_video_summary_new = placement_by_km_video_summary.loc[
    placement_by_km_video_summary.reset_index().groupby(['PLACEMENT', 'PRODUCT'])['Views'].idxmax()]
#print (placement_by_video_summary_new)
#exit()
# print (placement_by_video_summary_new)
# mask22 = (placement_by_video_summary_new.PRODUCT.str.upper ()=='DISPLAY') & (placement_by_video_summary_new.COST_TYPE=='CPE')

placement_by_video_summary_new.loc[mask17 & mask18, 'Views'] = placement_by_video_summary_new['ENGAGEMENTS']
placement_by_video_summary_new.loc[mask19 & mask20, 'Views'] = placement_by_video_summary_new['IMPRESSIONS']
placement_by_video_summary_new.loc[mask17 & mask21, 'Views'] = placement_by_video_summary_new['DPEENGAMENTS']

#print (placement_by_video_summary_new)
#exit()
placement_by_video_summary = placement_by_video_summary.drop(placement_by_video_summary_new.index).append(
    placement_by_video_summary_new).sort_index()

placement_by_video_summary["Video Completion Rate"] = placement_by_video_summary["100_pc_video"] / \
                                                      placement_by_video_summary["Views"]

placement_by_video_final = placement_by_video_summary.loc[:,
                           ["Placement# Name", "PRODUCT", "VIDEONAME", "Views",
                            "25_pc_video", "50_pc_video", "75_pc_video", "100_pc_video",
                            "Video Completion Rate"]]

Yanıtlar:


136

tl; dr:

concatve appendşu anda, sütunlar eşleşmiyorsa birleştirme olmayan dizini (örneğin satır ekliyorsanız sütunlar) sıralayın. Pandalar 0.23'te bu bir uyarı üretmeye başladı; sort=Truesusturmak için parametreyi iletin. Gelecekte varsayılan olarak değişecektir değil belirtilmesi ya Dolayısıyla en iyisi, sıralama sort=Trueya Falseşimdi, ya da daha iyisi senin olmayan birleştirme endeksleri maç emin olun.


Uyarı, Pandalar 0.23.0'da yenidir :

Pandaların gelecekteki bir sürümünde pandas.concat()ve DataFrame.append()zaten hizalı olmadığında artık birleştirme olmayan ekseni sıralamayacak. Geçerli davranış önceki davranışla aynıdır (sıralama), ancak artık sıralama belirtilmediğinde ve bitiştirme ekseni hizalı olmadığında bir uyarı verilir, bağlantı .

Bağlantılı çok eski github sorunundan daha fazla bilgi, smcinerney tarafından yorum :

DataFrame'leri birleştirirken, aralarında herhangi bir fark varsa sütun adları alfanümerik olarak sıralanır. DataFrame'lerde aynıysa, sıralanmazlar.

Bu tür belgelenmemiş ve istenmeyen. Kesinlikle varsayılan davranış sırasız olmalıdır.

Bir süre sonra parametre sortuygulandı pandas.concatve DataFrame.append:

sort : boole, varsayılan Yok

Birleştirme "dış" olduğunda zaten hizalı değilse, birleştirme olmayan ekseni sıralayın. Geçerli sıralama varsayılanı kullanımdan kaldırılmıştır ve pandaların gelecekteki bir sürümünde sıralanmaz olarak değişecektir.

Uyarıyı susturmak ve sıralamak için açıkça sort = True geçirin. Uyarıyı susturmak ve sıralamayı engellemek için açıkça sort = False geçirin.

Bu, birleşimsiz eksenin sırasını zaten koruyan birleştirme = 'iç' olduğunda hiçbir etkisi yoktur.

Dolayısıyla, her iki DataFrame'de aynı sırada aynı sütunlar varsa, hiçbir uyarı ve sıralama yoktur:

df1 = pd.DataFrame({"a": [1, 2], "b": [0, 8]}, columns=['a', 'b'])
df2 = pd.DataFrame({"a": [4, 5], "b": [7, 3]}, columns=['a', 'b'])

print (pd.concat([df1, df2]))
   a  b
0  1  0
1  2  8
0  4  7
1  5  3

df1 = pd.DataFrame({"a": [1, 2], "b": [0, 8]}, columns=['b', 'a'])
df2 = pd.DataFrame({"a": [4, 5], "b": [7, 3]}, columns=['b', 'a'])

print (pd.concat([df1, df2]))
   b  a
0  0  1
1  8  2
0  7  4
1  3  5

Ancak DataFrame'lerin farklı sütunları veya farklı bir sırada aynı sütunları varsa, pandalar hiçbir parametre sortaçıkça ayarlanmadıysa bir uyarı verir ( sort=Nonevarsayılan değerdir):

df1 = pd.DataFrame({"a": [1, 2], "b": [0, 8]}, columns=['b', 'a'])
df2 = pd.DataFrame({"a": [4, 5], "b": [7, 3]}, columns=['a', 'b'])

print (pd.concat([df1, df2]))

FutureWarning: Birleştirilmemiş eksen hizalı olmadığı için sıralama.

   a  b
0  1  0
1  2  8
0  4  7
1  5  3

print (pd.concat([df1, df2], sort=True))
   a  b
0  1  0
1  2  8
0  4  7
1  5  3

print (pd.concat([df1, df2], sort=False))
   b  a
0  0  1
1  8  2
0  7  4
1  3  5

DataFrames farklı sütunlar, ancak ilk sütun hizalanırsa - düzgün (kolonlar birbirlerine atanacak ave bgelen df1olan ave bgelen df2her ikisi de mevcut olduğundan, aşağıdaki örnekte). DataFrame'lerden birinde bulunan ancak her ikisinde birden bulunmayan diğer sütunlar için eksik değerler oluşturulur.

Son olarak, geçerseniz sort=True, sütunlar alfanümerik olarak sıralanır. Eğer sort=Falseikinci DafaFrame ilk yer almayan sütun vardır, bunlar hiçbir sıralama ile sonuna eklenir:

df1 = pd.DataFrame({"a": [1, 2], "b": [0, 8], 'e':[5, 0]}, 
                    columns=['b', 'a','e'])
df2 = pd.DataFrame({"a": [4, 5], "b": [7, 3], 'c':[2, 8], 'd':[7, 0]}, 
                    columns=['c','b','a','d'])

print (pd.concat([df1, df2]))

FutureWarning: Birleştirilmemiş eksen hizalı olmadığı için sıralama.

   a  b    c    d    e
0  1  0  NaN  NaN  5.0
1  2  8  NaN  NaN  0.0
0  4  7  2.0  7.0  NaN
1  5  3  8.0  0.0  NaN

print (pd.concat([df1, df2], sort=True))
   a  b    c    d    e
0  1  0  NaN  NaN  5.0
1  2  8  NaN  NaN  0.0
0  4  7  2.0  7.0  NaN
1  5  3  8.0  0.0  NaN

print (pd.concat([df1, df2], sort=False))

   b  a    e    c    d
0  0  1  5.0  NaN  NaN
1  8  2  0.0  NaN  NaN
0  7  4  NaN  2.0  7.0
1  3  5  NaN  8.0  0.0

Kodunuzda:

placement_by_video_summary = placement_by_video_summary.drop(placement_by_video_summary_new.index)
                                                       .append(placement_by_video_summary_new, sort=True)
                                                       .sort_index()

21
Bunu tam olarak anlamıyorum: In a future version of pandas pandas.concat() and DataFrame.append() will no longer sort the non-concatenation axis when it is not already aligned. a non-concatenation axisnedir ve sonuç nasıl görünecek? a ve b sütunu uyumsuz mu? yoksa sadece sütun sırası farklı mı?
bir teklif

9
Ne is not alignedanlama geldiği belli değil - bunun üzerine yorum yapabilir misin?
Mr_and_Mrs_D

1
Eksendeki alignedseviyelerin aynı olduğu anlamına geldiğine inanıyorum : herhangi bir fark varsa, artık yoktur alignedve bu davranışı tetikleyecektir (örneğin eksen seviyeleri ['c','b','a']ve ise ['a'])
Robert Muil

3
@RobertMuil Bir MultiIndex olduğunda pandalar veri çerçeveleri için belirli bir anlamı olduğu için buradaki terimi kullanmanın levelkafa karıştırıcı olabileceğini düşünüyorum level. Anladığım kadarıyla, alignedbu bağlamda satır / sütun dizininin sıralanmasını ifade ediyor. Dolayısıyla, birleştirme olmayan eksen dizin sırası iki çerçeveniz için farklıysa, geçirilen ilk karedeki sırayı koruyup korumayacağınızı ve eşleşecek ikinci kareyi sıralamayı veya birleştirmeden önce HER İKİ karenin dizinini sıralamayı belirleyebilirsiniz. Bu benim için de kafa karıştırıcı bir alan, bu yüzden düzeltmeler hoş geldiniz!
ac24

Sütunlar ne zaman hizalanır tuple(df1.columns) == tuple(df2.columns). Bitişik olmayan eksen, Veri Çerçevelerinin birbirine dikildiği dikişlere paralel eksendir (satırlar veya sütunlar).
BallpointBen

107

jezrael'in cevabı güzel, ancak sorduğum bir soruyu cevaplamadı: "Sıralama" bayrağını yanlış almak verilerimi herhangi bir şekilde karıştırır mı? Cevap görünüşe göre "hayır", her iki şekilde de iyisin.

from pandas import DataFrame, concat

a = DataFrame([{'a':1,      'c':2,'d':3      }])
b = DataFrame([{'a':4,'b':5,      'd':6,'e':7}])

>>> concat([a,b],sort=False)
   a    c  d    b    e
0  1  2.0  3  NaN  NaN
0  4  NaN  6  5.0  7.0

>>> concat([a,b],sort=True)
   a    b    c  d    e
0  1  NaN  2.0  3  NaN
0  4  5.0  NaN  6  7.0

tam olarak ne sıralanır veya sıralanmaz?
Ben

2
@Ben, sütun sırası veri çerçeveleri arasında farklı olduğunda uyarı görünür. Gördüğünüz gibi sırala = Doğru ise, bu durumda birleştirmeden sonraki sütunlar alfabetik olarak sıralanır
MP23

Bu örnekte böyle değildir, ancak birden çok Series veya DataFrame'i bir DatetimeIndex ile birleştirirseniz, satırlar artık kronolojik sırada olmaz. Teknik olarak veriler düzensiz değildir, ancak sonucunuzun okunması daha zor olabilir.
hugovdberg
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.