python 获取每行的第一个和第n个非空值

am46iovg  于 2023-02-21  发布在  Python
关注(0)|答案(2)|浏览(188)

我有以下输入 Dataframe :

0     1     2     3    4
date                                  
2007-02-15  NaN -0.88  0.80   NaN  0.5
2007-02-16  0.5 -0.84   NaN  0.29  NaN
2007-02-19  NaN -0.84  0.79  0.29  NaN
2007-02-20  0.5  0.50  0.67  0.20  0.5

我需要得到一个输出 Dataframe ,其中每一行都有第一个和第n个(例如第三个)非空值。

1st   3rd
date                  
2007-02-15 -0.88  0.50
2007-02-16  0.50  0.29
2007-02-19 -0.84  0.29
2007-02-20  0.50  0.67

对于第一个值,我知道我可以执行以下操作:

df2['1st'] = df.fillna(method='bfill', axis=1).iloc[:, 0]

但是我该怎么做才能找到第三个呢?谢谢

uhry853o

uhry853o1#

第一次和第三次
g = df.stack().groupby(level=0)

out = pd.concat({'1st': g.first(), '3rd': g.nth(2)}, axis=1)

输出:

1st   3rd
date                  
2007-02-15 -0.88  0.50
2007-02-16  0.50  0.29
2007-02-19 -0.84  0.29
2007-02-20  0.50  0.67

第一个和最后一个

您可以按照初始逻辑再添加一个ffill,并对第一列和最后一列进行切片:

df.bfill(axis=1).ffill(axis=1).iloc[:, [0,-1]].set_axis(['1st', '3rd'], axis=1)

输出:

1st   3rd
date                  
2007-02-15 -0.88  0.50
2007-02-16  0.50  0.29
2007-02-19 -0.84  0.29
2007-02-20  0.50  0.50

stackgroupby.agg的另一个选项:

df.stack().groupby(level=0).agg(['first', 'last'])

输出:

first  last
date                   
2007-02-15  -0.88  0.50
2007-02-16   0.50  0.29
2007-02-19  -0.84  0.29
2007-02-20   0.50  0.50
k4emjkb1

k4emjkb12#

您可以执行sorted,然后使用columns number选择值

out = df.transform(lambda x : sorted(x,key=pd.isnull),1)
Out[51]: 
               0     1     2    3    4
date                                  
2007-02-15 -0.88  0.80  0.50  NaN  NaN
2007-02-16  0.50 -0.84  0.29  NaN  NaN
2007-02-19 -0.84  0.79  0.29  NaN  NaN
2007-02-20  0.50  0.50  0.67  0.2  0.5
#first = out[0]

相关问题