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