Cảnh báo người dùng Python Pandas: Sắp xếp do trục không nối không được căn chỉnh


92

Tôi đang thực hiện một số thực hành mã và áp dụng hợp nhất các khung dữ liệu trong khi thực hiện việc này thì nhận được cảnh báo của người dùng

/usr/lib64/python2.7/site-packages/pandas/core/frame.py:6201: FutureWarning: Sắp xếp do trục không nối không được căn chỉnh. Phiên bản gấu trúc trong tương lai sẽ thay đổi thành không sắp xếp theo mặc định. Để chấp nhận hành vi trong tương lai, hãy chuyển 'sort = True'. Để giữ lại hành vi hiện tại và tắt tiếng cảnh báo, hãy chuyển sort = False

Trên những dòng mã này: Bạn có thể vui lòng giúp đỡ để có được giải pháp của cảnh báo này không.

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

Câu trả lời:


135

tl; dr:

concatappendhiện sắp xếp chỉ mục không nối (ví dụ: cột nếu bạn đang thêm hàng) nếu các cột không khớp. Ở gấu trúc 0,23, điều này bắt đầu tạo ra một cảnh báo; truyền tham số sort=Trueđể tắt tiếng nó. Trong tương lai, mặc định sẽ thay đổi thành không sắp xếp, vì vậy tốt nhất bạn nên chỉ định một trong hai sort=Truehoặc Falsengay bây giờ, hoặc tốt hơn là đảm bảo rằng các chỉ số không nối của bạn khớp với nhau.


Cảnh báo mới trong gấu trúc 0.23.0 :

Trong phiên bản gấu trúc trong tương lai pandas.concat()DataFrame.append()sẽ không sắp xếp trục không nối khi nó chưa được căn chỉnh. Hành vi hiện tại giống như trước (sắp xếp), nhưng bây giờ một cảnh báo được đưa ra khi sắp xếp không được chỉ định và trục không nối không được căn chỉnh, liên kết .

Thông tin thêm từ vấn đề github rất cũ được liên kết , bình luận của smcinerney :

Khi kết hợp DataFrames, các tên cột được sắp xếp theo chữ và số nếu có bất kỳ sự khác biệt nào giữa chúng. Nếu chúng giống hệt nhau trên các DataFrames, chúng sẽ không được sắp xếp.

Loại này không có giấy tờ và không mong muốn. Chắc chắn hành vi mặc định không được sắp xếp.

Sau một thời gian, tham số sortđược triển khai trong pandas.concatDataFrame.append:

sắp xếp : boolean, mặc định Không có

Sắp xếp trục không nối nếu nó chưa được căn chỉnh khi nối là 'bên ngoài'. Tính năng sắp xếp mặc định hiện tại không được dùng nữa và sẽ thay đổi thành không sắp xếp trong phiên bản gấu trúc trong tương lai.

Truyền rõ ràng sort = True để tắt cảnh báo và sắp xếp. Truyền rõ ràng sort = False để tắt cảnh báo và không sắp xếp.

Điều này không có tác dụng khi tham gia = 'bên trong', đã bảo toàn thứ tự của trục không nối.

Vì vậy, nếu cả hai DataFrames có cùng các cột theo cùng một thứ tự, sẽ không có cảnh báo và không có sắp xếp:

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

Nhưng nếu DataFrames có các cột khác nhau hoặc các cột giống nhau theo thứ tự khác nhau, pandas trả về cảnh báo nếu không có tham số nào sortđược đặt rõ ràng ( sort=Nonelà giá trị mặc định):

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: Sắp xếp vì trục không nối không được căn chỉnh.

   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

Nếu DataFrames có các cột khác nhau, nhưng các cột đầu tiên được liên kết - họ sẽ được chỉ định một cách chính xác với nhau (cột abtừ df1với abtừ df2trong ví dụ dưới đây) vì chúng tồn tại trong cả hai. Đối với các cột khác tồn tại trong một chứ không phải cả hai DataFrames, các giá trị bị thiếu sẽ được tạo.

Cuối cùng, nếu bạn vượt qua sort=True, các cột được sắp xếp theo chữ và số. Nếu sort=Falsevà DafaFrame thứ hai có các cột không nằm trong cột đầu tiên, chúng sẽ được nối vào cuối mà không cần sắp xếp:

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: Sắp xếp vì trục không nối không được căn chỉnh.

   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

Trong mã của bạn:

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
Tôi không hiểu rõ điều này: 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 là non-concatenation axisgì và kết quả sẽ như thế nào? cột a và cột b sẽ không khớp nhau? hay chỉ thứ tự cột là khác nhau?
một đề nghị không thể từ chối

9
Không rõ is not alignednghĩa là gì - bạn có thể bình luận về điều đó không?
Mr_and_Mrs_D

1
Tôi tin rằng alignedphương tiện mà các cấp ở trên trục đều giống nhau: nếu có một sự khác biệt của bất cứ loại nào, họ không còn alignedvà sẽ kích hoạt hành vi này (ví dụ như nếu trục mức là ['c','b','a']['a'])
Robert Muil

3
@RobertMuil Tôi nghĩ rằng việc sử dụng thuật ngữ levelở đây có khả năng gây nhầm lẫn vì levelcó ý nghĩa cụ thể đối với khung dữ liệu gấu trúc khi có MultiIndex. Theo những gì tôi hiểu, alignedtrong ngữ cảnh này đề cập đến thứ tự của chỉ mục hàng / cột. Vì vậy, nếu thứ tự chỉ mục trục không nối khác nhau đối với hai khung của bạn, thì bạn có thể chỉ định xem có giữ lại thứ tự trong khung đầu tiên được truyền hay không và sắp xếp khung thứ hai để khớp hoặc sắp xếp chỉ mục của CẢ hai khung trước khi ghép. Đây là một lĩnh vực khó hiểu đối với tôi vì vậy chúng tôi hoan nghênh các sửa chữa!
ac24

Các cột được căn chỉnh khi tuple(df1.columns) == tuple(df2.columns). Trục không nối là trục (hàng hoặc cột) song song với các đường nối mà các DataFrames đang được ghép lại với nhau.
BallpointBen

107

Câu trả lời của jezrael rất hay, nhưng không trả lời được câu hỏi của tôi: Việc nhận nhầm cờ "sắp xếp" có làm rối tung dữ liệu của tôi theo bất kỳ cách nào không? Câu trả lời rõ ràng là "không", bạn vẫn ổn.

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

chính xác thì hier được sắp xếp hay không được sắp xếp?
Ben

2
@Ben cảnh báo xuất hiện khi thứ tự cột khác nhau giữa các khung dữ liệu. Như bạn có thể thấy nếu loại = True thì các cột sau concatentation đều được sắp xếp theo thứ tự abc
MP23

Trong ví dụ này thì không, nhưng nếu bạn nối nhiều Series hoặc DataFrames với một DatetimeIndex thì các hàng không còn theo thứ tự thời gian nữa. Về mặt kỹ thuật, dữ liệu không bị lộn xộn, nhưng kết quả của bạn có thể khó đọc hơn.
hugovdberg
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.