Розглянемо фрейм даних 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
стовпчик, і Pandas вирішує просто обнулити значення.
Це стає більш проблематичним , коли 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
в якому результат змістив значення та типи?
Для 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
blocks
>. <Використовуйте це замість і дивітьсяdf = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
object
?