我有一个数据框,其中行已水平移动数量不详。每一行都移动了不同的量如下所示:
标题1 | 标题2 | 未命名:1 | 未命名:2 | 南 | 34 | 24 | 南 | 5
---|---|---|---|
南 | 南 | 南 | |
南 | 南 | 13 | 77 |
南 | 南 | 南 | 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]
您可以使用isna
和cummin
来识别领先的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