Python Pandas-Benutzerwarnung: Sortieren, da die Nichtverkettungsachse nicht ausgerichtet ist

90

Ich übe Code und wende das Zusammenführen von Datenrahmen an, während ich eine Benutzerwarnung erhalte

/usr/lib64/python2.7/site-packages/pandas/core/frame.py:6201: FutureWarning: Sortieren, da die Achse ohne Verkettung nicht ausgerichtet ist. Eine zukünftige Version von Pandas wird so geändert, dass sie nicht standardmäßig sortiert wird. Um das zukünftige Verhalten zu akzeptieren, übergeben Sie 'sort = True'. Übergeben Sie sort = False, um das aktuelle Verhalten beizubehalten und die Warnung auszuschalten

Zu diesen Codezeilen: Können Sie bitte helfen, die Lösung dieser Warnung zu finden?

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"]]
MishD
quelle

Antworten:

134

tl; dr:

concatund appendsortieren Sie derzeit den Nicht-Verkettungsindex (z. B. Spalten, wenn Sie Zeilen hinzufügen), wenn die Spalten nicht übereinstimmen. In Pandas 0.23 wurde eine Warnung generiert. Übergeben Sie den Parameter sort=True, um ihn zum Schweigen zu bringen. In Zukunft wird sich die Standardeinstellung in " Nicht sortieren" ändern. Geben Sie daher entweder sort=Trueoder Falsejetzt an oder stellen Sie besser sicher, dass Ihre Nicht-Verkettungsindizes übereinstimmen.


Die Warnung ist neu in Pandas 0.23.0 :

In einer zukünftigen Version von Pandas pandas.concat()und DataFrame.append()wird nicht mehr Art der Nicht-Verkettungs Achse , wenn es nicht bereits ausgerichtet. Das aktuelle Verhalten ist das gleiche wie zuvor , (Sortierung), aber nun wird eine Warnung ausgegeben wird , wenn nicht spezifiziert ist eine Art und die Nicht-Verkettungs Achse nicht ausgerichtet Verbindung .

Weitere Informationen aus der verknüpften sehr alten Github-Ausgabe, Kommentar von smcinerney :

Beim Konatieren von DataFrames werden die Spaltennamen alphanumerisch sortiert, wenn zwischen ihnen Unterschiede bestehen. Wenn sie in DataFrames identisch sind, werden sie nicht sortiert.

Diese Art ist nicht dokumentiert und unerwünscht. Sicherlich sollte das Standardverhalten nicht sortiert sein.

Nach einiger Zeit wurde der Parameter sortimplementiert in pandas.concatund DataFrame.append:

sort : boolean, default None

Sortieren Sie die Nicht-Verkettungsachse, wenn sie nicht bereits ausgerichtet ist, wenn die Verknüpfung "äußerlich" ist. Die aktuelle Standardeinstellung für das Sortieren ist veraltet und wird in einer zukünftigen Version von Pandas in Nicht-Sortieren geändert.

Sort explizit übergeben = True, um die Warnung und Sortierung zum Schweigen zu bringen. Übergeben Sie sort = False explizit, um die Warnung auszuschalten und nicht zu sortieren.

Dies hat keine Auswirkung, wenn join = 'inner' ist, wodurch die Reihenfolge der Nichtverkettungsachse bereits beibehalten wird.

Wenn also beide DataFrames dieselben Spalten in derselben Reihenfolge haben, gibt es keine Warnung und keine Sortierung:

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

Wenn die DataFrames jedoch unterschiedliche Spalten oder dieselben Spalten in einer anderen Reihenfolge haben, gibt pandas eine Warnung zurück, wenn kein Parameter sortexplizit festgelegt wurde ( sort=Noneist der Standardwert):

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: Sortieren, da die Nichtverkettungsachse nicht ausgerichtet ist.

   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

Wenn die DataFrames unterschiedliche Spalten haben, die ersten Spalten jedoch ausgerichtet sind, werden sie einander korrekt zugewiesen (Spalten aund bvon df1mit aund bvon df2im folgenden Beispiel), da sie in beiden vorhanden sind. Für andere Spalten, die in einem, aber nicht in beiden DataFrames vorhanden sind, werden fehlende Werte erstellt.

Wenn Sie bestehen sort=True, werden die Spalten alphanumerisch sortiert. Wenn sort=Falseund der zweite DafaFrame Spalten enthält, die nicht in der ersten enthalten sind, werden sie ohne Sortierung an das Ende angehängt:

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: Sortieren, da die Nichtverkettungsachse nicht ausgerichtet ist.

   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

In Ihrem Code:

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()
jezrael
quelle
21
Ich verstehe das nicht ganz: 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. Was ist ein non-concatenation axisund wie wird das Ergebnis aussehen? stimmt Spalte a und Spalte b nicht überein? oder ist nur die Spaltenreihenfolge anders?
Ein Angebot kann den
9
Es ist nicht klar, was is not alignedbedeutet - könnten Sie das kommentieren?
Mr_and_Mrs_D
1
Ich glaube alignedbedeutet, dass die Ebenen in der Achse gleich sind: Wenn es einen Unterschied gibt, sind sie nicht mehr vorhanden alignedund lösen dieses Verhalten aus (z. B. wenn die ['c','b','a']['a']
Achsenebenen
3
@RobertMuil Ich denke, die Verwendung des Begriffs levelhier ist möglicherweise verwirrend, da er leveleine spezifische Bedeutung für Pandas-Datenrahmen hat, wenn es einen MultiIndex gibt. Soweit ich weiß, alignedbezieht sich dies in diesem Zusammenhang auf die Reihenfolge des Zeilen- / Spaltenindex. Wenn also die Indexreihenfolge der Nicht-Verkettungsachse für Ihre beiden Frames unterschiedlich ist, können Sie angeben, ob die Reihenfolge im ersten übergebenen Frame beibehalten und der zweite Frame entsprechend sortiert werden soll oder ob der Index BEIDER Frames vor der Verkettung sortiert werden soll. Dies ist auch für mich ein verwirrender Bereich, daher sind Korrekturen willkommen!
AC24
Spalten werden ausgerichtet, wenn tuple(df1.columns) == tuple(df2.columns). Die Nicht-Verkettungsachse ist die Achse (Zeilen oder Spalten) parallel zu den Nähten, entlang derer die DataFrames zusammengefügt werden.
BallpointBen
107

Jezraels Antwort ist gut, hat aber keine Frage beantwortet, die ich hatte: Wird das falsche "Sortieren" -Flag meine Daten in irgendeiner Weise durcheinander bringen? Die Antwort ist anscheinend "nein", es geht dir so oder so gut.

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
RLC
quelle
Was genau ist hier sortiert oder nicht sortiert?
Ben
2
@Ben Die Warnung wird angezeigt, wenn die Spaltenreihenfolge zwischen den Datenrahmen unterschiedlich ist. Wie Sie sehen können, wenn sort = True, werden die Spalten nach der
Konzentration
In diesem Beispiel ist dies nicht der Fall. Wenn Sie jedoch mehrere Serien oder DataFrames mit einem DatetimeIndex verknüpfen, sind die Zeilen nicht mehr in chronologischer Reihenfolge. Technisch gesehen sind die Daten nicht durcheinander, aber Ihr Ergebnis ist möglicherweise schwerer zu lesen.
Hugovdberg