pandas中的内爆值

rjee0c15  于 2023-03-21  发布在  其他
关注(0)|答案(2)|浏览(81)
Num  Name

1    abcd
2    nan
3    nan
4    efdg
5    nan
6    hij
7    nan
8    nan
9   nan
10   nan
11   xyz

# output 

# need output like where we find nulls:
(2,3)  , 5 , (7,10)

我试过把数据分组。

wrrgggsh

wrrgggsh1#

not nannan 之间交换时定义一个groupchange。然后可以使用cumsum派生一个组,并使用minmax派生一个组

df['group']=(df.Name.isna() != df.Name.isna().shift(1)).cumsum()

df_agg = df.groupby('group').agg({'Name':'first','Num':['min','max']})

output = [(a,b) if a!=b else a for a,b in df_agg.loc[df_agg[('Name','first')].isna(),[('Num','min'),('Num','max')]].values]

这将在列表中产生所需的输出

[(2, 3), 5, (7, 10)]
1tu0hz3e

1tu0hz3e2#

试试这个:
这将过滤df以仅包含NaN值,并使用groupby() to对NaNnon NaN值之间的更改进行分组。最后,我们使用iloc选择Num列中的第一个和最后一个值,并使用dict.fromkeys()仅选择唯一值,并保持顺序。

(df.loc[df['Name'].isna(),'Num']
.astype('str')
.groupby(df['Name'].isna().diff().ne(0).cumsum())
.agg(lambda x: ','.join(list(dict.fromkeys(x.iloc[[0,-1]])))))

输出:

Name
2     2,3
4       5
6    7,10

相关问题