Python Pandas 사용자 경고 : 비 연결 축이 정렬되지 않아 정렬 중입니다.


94

사용자 경고가 표시되는 동안 일부 코드 연습을 수행하고 데이터 프레임 병합을 적용하고 있습니다.

/usr/lib64/python2.7/site-packages/pandas/core/frame.py:6201 : FutureWarning : 비 연결 축이 정렬되지 않아 정렬 중입니다. 이후 버전의 Pandas는 기본적으로 정렬되지 않도록 변경됩니다. 향후 동작을 수락하려면 'sort = True'를 전달하십시오. 현재 동작을 유지하고 경고를 무시하려면 sort = False를 전달하십시오.

이 코드 줄에서 :이 경고의 해결책을 얻는 데 도움을 주시겠습니까?

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

답변:


137

tl; dr :

concat그리고 append현재 정렬 비 연결 지수 (예 : 열 당신이 행을 추가하는 경우) 열이 일치하지 않는 경우. pandas 0.23에서 이것은 경고를 생성하기 시작했습니다. sort=True그것을 침묵시키기 위해 매개 변수 를 전달하십시오 . 나중에 기본값이 정렬 되지 않도록 변경 되므로 sort=True또는 False지금 을 지정하는 것이 가장 좋으며 비 연결 인덱스가 일치하는지 확인하는 것이 좋습니다.


이 경고는 Pandas 0.23.0의 새로운 기능입니다 .

팬더의 미래 버전에서 pandas.concat()DataFrame.append()더 이상 정렬되지 않은 연결 축이 이미 정렬되지되지 않은 때. 현재 동작은 이전 (정렬)과 동일하지만 이제 정렬이 지정되지 않고 비 연결 축이 정렬되지 않은 경우 경고가 발생 합니다 .

연결된 아주 오래된 github 문제 에서 더 많은 정보 , smcinerney의 의견 :

DataFrame을 연결할 때 열 이름이 서로 다른 경우 영숫자 순으로 정렬됩니다. DataFrame에서 동일하면 정렬되지 않습니다.

이 종류는 문서화되지 않았으며 원하지 않습니다. 물론 기본 동작은 정렬되지 않아야합니다.

잠시 후 매개 변수 sortpandas.concat및 에서 구현되었습니다 DataFrame.append.

정렬 : 부울, 기본값 없음

결합이 '외부'일 때 아직 정렬되지 않은 경우 비 연결 축을 정렬합니다. 현재 정렬 기본값은 더 이상 사용되지 않으며 향후 버전의 Pandas에서 정렬되지 않음으로 변경됩니다.

경고를 없애고 정렬하려면 sort = True를 명시 적으로 전달합니다. 정렬이 아닌 경고를 무음으로 설정하려면 sort = False를 명시 적으로 전달하십시오.

이는 이미 비 연결 축의 순서를 유지하는 join = 'inner'인 경우 효과가 없습니다.

따라서 두 DataFrame에 동일한 순서로 동일한 열이있는 경우 경고 및 정렬이 없습니다.

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

그러나 DataFrames에 다른 열이 있거나 다른 순서로 동일한 열이있는 경우 pandas는 매개 변수 sort가 명시 적으로 설정 되지 않은 경우 경고를 반환합니다 ( sort=None기본값 임).

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 : 비 연결 축이 정렬되지 않아 정렬 중입니다.

   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 다른 열을 가지고 있지만, 제 열을 정렬하는 경우 - 그들은 올바르게 (열 각각에 할당한다 ab에서 df1함께 a그리고 b에서 df2그들이 모두 존재하기 때문에 아래의 예). 둘 다가 아닌 하나의 DataFrame에있는 다른 열의 경우 누락 된 값이 생성됩니다.

마지막으로를 전달 sort=True하면 열이 영숫자 순으로 정렬됩니다. 경우 sort=False두 번째 DafaFrame 처음에없는 열이 있습니다, 그들은 어떤 정렬을 가진 끝에 추가됩니다 :

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 : 비 연결 축이 정렬되지 않아 정렬 중입니다.

   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

코드에서 :

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
나는 이것을 잘 이해하지 못합니다. 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 axis그 결과는 어떻게 보일까요? 열 a와 열 b가 일치하지 않습니까? 아니면 열 순서가 다른가요?
제안은

9
무슨 is not aligned뜻 인지 는 분명하지 않습니다. 그것에 대해 언급 해 주시겠습니까?
Mr_and_Mrs_D

1
나는 믿을 aligned축에서 수준이 동일한 지 방법을 : 어떤 종류의 차이가있는 경우, 그들은 더 이상 aligned하고 (축 수준은 예를 들어 경우이 동작을 트리거 ['c','b','a']하고 ['a'])
로버트 Muil

3
@RobertMuil level여기 에 용어를 사용하면 levelMultiIndex가있을 때 pandas 데이터 프레임에 대한 특정 의미 가 있으므로 혼란 스러울 수 있습니다. 내가 이해 한 바에 따르면 aligned이 컨텍스트에서 행 / 열 인덱스의 순서를 나타냅니다. 따라서 두 프레임에 대해 비 연결 축 인덱스 순서가 다른 경우 전달 된 첫 번째 프레임의 순서를 유지할지 여부를 지정하고 일치하도록 두 번째 프레임을 정렬하거나 연결하기 전에 두 프레임의 인덱스를 정렬 할 수 있습니다. 이것은 나에게도 혼란스러운 영역이므로 수정을 환영합니다!
ac24

열은 tuple(df1.columns) == tuple(df2.columns). 비 연결 축은 DataFrame이 함께 스티칭되는 이음새에 평행 한 축 (행 또는 열)입니다.
BallpointBen

107

jezrael의 대답은 좋지만 내가 가진 질문에는 대답하지 않았습니다. "정렬"플래그가 잘못되면 데이터가 어떤 식 으로든 엉망이 될까요? 대답은 분명히 "아니오"입니다. 어느 쪽이든 괜찮습니다.

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

정확히 어떤 것이 분류되고 분류되지 않습니까?
Ben

2
@Ben 데이터 프레임간에 열 순서가 다를 때 경고가 나타납니다. sort = True 인 경우 볼 수 있듯이 연결 후 열은 알파벳순으로 정렬됩니다.
MP23

이 예제에서는 그렇지 않지만 여러 Series 또는 DataFrame을 DatetimeIndex와 연결하면 행이 더 이상 시간순으로 표시되지 않습니다. 기술적으로 데이터는 엉망이 아니지만 결과를 읽기가 더 어려울 수 있습니다.
hugovdberg
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.