[英]Pandas get highest non-null value in each row, in dataframe with variable number of columns
我有一個包含以下示例數據的數據框,其中Col.x
格式的列數未知:
Col.1,Col.2,Col.3
Val1,
Val2,Val3
Val3,
Val4,Val2,Val3
我需要有一個單獨的列,其中的值是從非 null 的最大 x 數填充的。 如:
Col.1,Col.2,Col.3,Latest
Val1,,,Val1
Val2,Val3,,Val3
Val3,,,Val3
Val4,Val2,Val3,Val3
我能夠用下面的代碼解決這個問題,但這個解決方案取決於a)知道確切的列名和b)不以可擴展的方式處理可變數量的列:
df["Latest"] = np.where(df["Col.3"].isnull(),np.where(df["Col.2"].isnull(),df["Col.1"],df["Col.2"]),df["Col.3"])
a) 我可以解決...
cols = [col for col in df.columns if 'Col' in col]
...我需要 b) 部分的幫助。
我們可以使用filter
來提取某些列。 like
和regex
是兩個可以使用的強大選項。
鑒於:
Col1 Col2 Col3 Ignore_me
0 18.0 NaN 40.0 82.0
1 6.0 NaN NaN 92.0
2 100.0 NaN 19.0 43.0
3 38.0 98.0 NaN 8.0
正在做:
df['Latest'] = (df[df.filter(like='Col') # Using filter to select certain columns.
.columns
.sort_values(ascending=False)] # Sort them descending.
.bfill(axis=1) # backfill values
.iloc[:,0]) # take the first column,
# This has the first non-nan value.
輸出,我們可以看到Ignore_me
沒有被使用:
Col1 Col2 Col3 Ignore_me Latest
0 18.0 NaN 40.0 82.0 40.0
1 6.0 NaN NaN 92.0 6.0
2 100.0 NaN 19.0 43.0 19.0
3 38.0 98.0 NaN 8.0 98.0
將fillna
與functools.reduce
一起使用:
# sort column names by suffix in reverse order
cols = sorted(
(col for col in df.columns if col.startswith('Col')),
key=lambda col: -int(col.split('.')[1])
)
cols
# ['Col.3', 'Col.2', 'Col.1']
from functools import reduce
df['Latest'] = reduce(lambda x, y: x.fillna(y), [df[col] for col in cols])
df
# Col.1 Col.2 Col.3 Latest
#0 Val1 NaN NaN Val1
#1 Val2 NaN Val3 Val3
#2 Val3 NaN NaN Val3
#3 Val4 Val2 Val3 Val3
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.