tl; dr:
В пандах 0.23+ необходим параметр передачи sort=True
, если требуется сортировка столбцов или индекса после concat
или append
, для избежания прохода sort=False
.
Это новое поведение в пандах 0.23.0 :
В будущих версиях панд pandas.concat()
и DataFrame.append()
больше не будут сортироватьось неконкатенации, когда она еще не выровнена.Текущее поведение аналогично предыдущему (сортировка), но теперь выдается предупреждение, когда сортировка не указана, а ось неконкатенации не выровнена, ссылка .
Дополнительная информацияиз очень старой связанной проблемы github, комментарий smcinerney :
При объединении DataFrames имена столбцов сортируются в алфавитно-цифровом порядке, если между ними есть какие-либо различия.Если они идентичны в разных фреймах, они не сортируются.
Этот вид недокументирован и нежелателен.Конечно, поведение по умолчанию должно быть без сортировки.
Через некоторое время был реализован параметр sort
в pandas.concat
и DataFrame.append
:
sort : логическое значение, по умолчанию нет
Сортировать неконкатенационную ось, если она еще не выровнена, когда соединение является "внешним".Текущее значение по умолчанию сортировки устарело и изменится на не сортировку в будущей версии панд.
Явно передайте 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
Но если разные столбцы, разный порядок или разные столбцы в обеих пандах, выдают предупреждение, если нет параметра 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 выровнены - это означает правильное назначение друг друга - столбцы a
и b
из df1
с a
и b
из столбца b
, поскольку существуют в обоих, для другого столбца создаютсяпропущенные значения, потому что они не существуют ни в первом, ни во втором.
Последнее, если передано sort=True
столбцы отсортированы буквенно-цифрово, если добавлено sort=False
столбцов из второго DafaFrame, если он не существует в первомd до конца без сортировки:
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()