从数据框中删除初始NaN,同时保持其他人的位置

时间:2018-05-03 12:03:33

标签: python-3.x numpy dataframe nan

请帮忙!我做了一些研究,这些问题是相关的,但我无法按摩这个工作: Multiple shifts on dataframe Shift entire column on a pandas dataframe Remove NaNs from DataFrame and duplicates from multi-index

这是我最接近我的问题: Shift rows to left

我的问题:时间序列问题所以如果第一个条目是NaN,我想将行移到左边,同时在初始第一个值之后保留该行中的任何其他NaN。

所以像这样启动DataFrame:

IConfiguration

我的解决方案是错误的,它看起来像这样:

  A     B     C     D
1 10    11    23    90
2 NaN   05    NaN   56
3 11    3     Nan   11
4 NaN   NaN   56    NaN`   

这给了(不是我想要的!)

df3 = df2.apply(lambda x: pd.Series(x.dropna().values),1)
df3.columns=df2.columns[:len(df3.columns)]
df3= df3.reindex_axis(df2.columns,1)

我想像这样的DataFrame:

  A     B     C     D
1 10    11    23    90
2 05    56    NaN   NaN
3 11    3     11    NaN
4 56    NaN   NaN   NaN  

因此删除了前沿 A B C D 1 10 11 23 90 2 05 NaN 56 NaN 3 11 3 NaN 11 4 56 NaN NaN NaN ,但是一旦进行了第一次测量,任何后续的NaNs都会留在原位。

非常感谢您的任何指导。

1 个答案:

答案 0 :(得分:0)

也许像

In [57]: df.apply(lambda x: x.shift(-x.notnull().values.argmax()), axis=1)
Out[57]: 
      A     B     C     D
1  10.0  11.0  23.0  90.0
2   5.0   NaN  56.0   NaN
3  11.0   3.0   NaN  11.0
4  56.0   NaN   NaN   NaN

这可以通过根据需要移动尽可能多的单元格来使第一个非空值到左边:

In [63]: x = df.iloc[1]

In [64]: x
Out[64]: 
A     NaN
B     5.0
C     NaN
D    56.0
Name: 2, dtype: float64

In [65]: x.notnull()
Out[65]: 
A    False
B     True
C    False
D     True
Name: 2, dtype: bool

In [66]: x.notnull().values
Out[66]: array([False,  True, False,  True])

In [67]: x.notnull().values.argmax()
Out[67]: 1

In [68]: x.shift(-x.notnull().values.argmax())
Out[68]: 
A     5.0
B     NaN
C    56.0
D     NaN
Name: 2, dtype: float64