对于熊猫数据帧中具有 NaN 的任何行,按 1 移动


from pandas import DataFrame
from numpy.random import randn
df = DataFrame(randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], columns=['one', 'two', 'three'])
df2 = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i'])
df2['one']['i'] = 5

这是我的输出

        one       two     three
a -1.132283 -1.204504 -0.763302
b       NaN       NaN       NaN
c  1.778895 -1.931615 -0.040319
d       NaN       NaN       NaN
e  0.612546 -0.846982  0.524779
f -0.527883  0.342746 -0.010093
g       NaN       NaN       NaN
h -0.636055 -0.909910  0.642658
i  5.000000       NaN       NaN

我试图弄清楚的是最后一行中有 NaN 的列(这是第 i 行,我想将这些列移动 1。

现在,我正在做df2['two'].shift(1)df2['three'].shift(1),但是有没有推荐的编码方法,我错过了?

所以我df2[-1:]作为最后一个索引...但我有点卡在这里。

可能有一种方法可以减少重复,但无论如何,以下内容应该有效。 首先,找出我们需要移动的列,然后将这些列替换为移位的版本。

to_shift = pd.isnull(df2.iloc[-1])
df2.loc[:,to_shift] = df2.loc[:,to_shift].shift(1)

获取最后一行:

>>> df2.iloc[-1]
one       5
two     NaN
three   NaN
Name: i, dtype: float64

查看缺少数据的地方:

>>> pd.isnull(df2.iloc[-1])
one      False
two       True
three     True
Name: i, dtype: bool
>>> to_shift = pd.isnull(df2.iloc[-1])

选择框架的该部分:

>>> df2.loc[:, to_shift]
        two     three
a -0.447225  0.240786
b       NaN       NaN
c  1.736224  0.191835
d       NaN       NaN
e -0.310505  2.121659
f  2.542979 -0.772117
g       NaN       NaN
h -0.350395  0.825386
i       NaN       NaN

移动它:

>>> df2.loc[:, to_shift].shift(1)
        two     three
a       NaN       NaN
b -0.447225  0.240786
c       NaN       NaN
d  1.736224  0.191835
e       NaN       NaN
f -0.310505  2.121659
g  2.542979 -0.772117
h       NaN       NaN
i -0.350395  0.825386

并用移位的数据填充帧:

>>> df2.loc[:, to_shift] = df2.loc[:, to_shift].shift(1)
>>> df2
        one       two     three
a -0.691010       NaN       NaN
b       NaN -0.447225  0.240786
c  0.570639       NaN       NaN
d       NaN  1.736224  0.191835
e  2.509598       NaN       NaN
f -2.053269 -0.310505  2.121659
g       NaN  2.542979 -0.772117
h  1.812492       NaN       NaN
i  5.000000 -0.350395  0.825386

最新更新