请帮忙!我做了一些研究,这些问题是相关的,但我无法按摩这个工作: 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
都会留在原位。
非常感谢您的任何指导。
答案 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