计算在pandas数据框中一行水平移动了多少



我有一个数据框,其中行已水平移动数量不详。每一行都移动了不同的量如下所示:

tbody> <<tr>5
标题1 标题2 未命名:1 未命名:2
3424
1377
18

更新答案

@mozway给出的逻辑是一个优雅的一行,我很喜欢,但由于某种原因并不总是有效。此外,它不会在额外的列中给出非nan值。

我设法让它工作在一个稍微长,但相对简单的理解逻辑。是:

#read the excel file
df = pd.read_excel('df.xlsx')
#subset the df into original and extra df's
extra = df.filter(regex=("Unnamed:.*"))
original = df.drop(extra, axis = 1)
#ori contains a list of count of NaN values in original columns as asked 
ori = original.isnull().sum(axis=1).tolist() #or to_dict() if you want a dict
ext = len(extra.columns) - extra.isnull().sum(axis=1)
#ext1 contains a list of count of non NaN values in the extra columns as asked
ext1 = ext.tolist() # or to_dict() if you want a dict

原始评论/回答

@mozway正如在评论中提到的,我正在添加您的代码,我试图将逻辑仅应用于dataframe的子集:

extra = df.filter(regex=("Unnamed:.*"))
y = extra.isna().cummin(axis=1).sum(axis=1).clip(upper=2).tolist()

根据数据帧,输出应该是[1,2,0,1](因为第1行有1个nan值,第2行有2个nan值,第3行有2个nan值,第4行有1个nan值),但上面的代码给出了输出[0,2,0,1]

您可以使用isnacummin来识别领先的NAs,然后使用sum来计数它们,使用clip来限制向原始列数的移动:

df.isna().cummin(axis=1).sum(axis=1).clip(upper=2)

输出:

0    1
1    0
2    2
3    2
dtype: int64

中间体:

df.isna()
Heading 1  Heading 2  Unnamed: 1  Unnamed: 2
0       True      False       False        True
1      False      False        True        True
2       True       True       False       False
3       True       True        True       False
df.isna().cummin(axis=1)
Heading 1  Heading 2  Unnamed: 1  Unnamed: 2
0       True      False       False       False
1      False      False       False       False
2       True       True       False       False
3       True       True        True       False
df.isna().cummin(axis=1).sum(axis=1)
0    1
1    0
2    2
3    3
dtype: int64

最新更新