考虑数据框 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
are 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
case,结果如下所示:
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
有用。我已经有一些解决方法。我只是在社区中寻求一些想法。
—
piRSquared
我将此作为问题提出,他们至少应提供将dtype提升为混合dtype的选项,例如
—
dtype dtype EdChum
object
我现在就做。
—
piRSquared
@ EdChum-ReinstateMonica请稍等!这种转变发生在
—
piRSquared
blocks
> <使用这个代替吧。df = pd.DataFrame(dict(A=[1, 2], B=[3., 4.], C=['X', 'Y'], D=[5., 6.], E=[7, 8], F=['W', 'Z']))
object
怎么办?