Рассмотрим кадр данных df
df = pd.DataFrame(dict(A=[1, 2], B=['X', 'Y']))
df
A B
0 1 X
1 2 Y
Если я смещусь axis=0
(по умолчанию)
df.shift()
A B
0 NaN NaN
1 1.0 X
Это толкает все ряды вниз на один ряд, как и ожидалось.
Но когда я сдвигаюсь axis=1
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Все ноль, когда я ожидал
A B
0 NaN 1
1 NaN 2
Я понимаю, почему это произошло. Поскольку axis=0
Pandas работает столбец за столбцом, где каждый столбец является единичным, dtype
а при сдвиге существует четкий протокол о том, как поступать с введенным NaN
значением в начале или в конце. Но при перемещении axis=1
мы вводим потенциальную неоднозначность dtype
от одного столбца к другому. В этом случае я пытаюсь применить силу int64
к object
столбцу, и Панда решает просто обнулить значения.
Это становится более проблематичным, когда dtypes
есть int64
иfloat64
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.]))
df
A B
0 1 1.0
1 2 2.0
И происходит то же самое
df.shift(axis=1)
A B
0 NaN NaN
1 NaN NaN
Мой вопрос
Каковы хорошие варианты для создания кадра данных, смещенного вдоль, axis=1
в котором результат имеет сдвинутые значения и dtypes?
Для случая int64
/ float64
будет выглядеть так:
df_shifted
A B
0 NaN 1
1 NaN 2
а также
df_shifted.dtypes
A object
B int64
dtype: object
Более полный пример
df = pd.DataFrame(dict(A=[1, 2], B=[1., 2.], C=['X', 'Y'], D=[4., 5.], E=[4, 5]))
df
A B C D E
0 1 1.0 X 4.0 4
1 2 2.0 Y 5.0 5
Должно выглядеть так
df_shifted
A B C D E
0 NaN 1 1.0 X 4.0
1 NaN 2 2.0 Y 5.0
df_shifted.dtypes
A object
B int64
C float64
D object
E float64
dtype: object
object
?object
blocks
>. <Используйте это вместо этого и посмотритеdf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
Ответы:
Оказывается, что Панды перемещаются по блокам аналогичного
dtypes
Определить
df
какОн сместит целые числа к следующему столбцу целых чисел, с плавающей точкой к следующему столбцу с плавающей точкой и объектам к следующему столбцу объекта
Я не знаю , если это хорошая идея, но это то , что происходит.
подходы
astype(object)
первыйtranspose
Сделаю это
object
itertuples
Хотя я бы, наверное, сделал это
источник
str
dytpes, то он работает правильно, если вы делаете то же самое на этом df,df = pd.DataFrame(dict(C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
он смещает'XY'
столбец до'F'
столбца, это определенно неправильно для меня, моя версия для панд такова0.24.2
, что она должнаdtype
продвигаться, а не сдвигать столбцы в таких случаях. путьЯ пытался использовать
numpy
метод. Метод работает до тех пор, пока вы храните свои данные в массиве:Но когда вы вызываете
DataFrame
конструктор, все столбцы преобразуются вobject
хотя значения в массивеfloat, int, object
:источник