我有這個資料集,其中有一些列(對計算并不重要),然后是許多具有相同起始名稱的列。我想計算每行包含 NaN 值以外的列的總和。該集合看起來像這樣:
| ID | 某物 | 1號 | 2號 | 編號3 | 編號4 |
|---|---|---|---|---|---|
| 1 | 105 | 200 | 鈉 | 鈉 | 50 |
| 2 | 300 | 2 | 1 | 1 | 33 |
| 3 | 20 | 1 | 鈉 | 鈉 | 鈉 |
所以我想創建一個新列,其中包含有值的數字列的長度。所以最終的資料集看起來像這樣:
| ID | 某物 | 1號 | 2號 | 編號3 | 編號4 | sum_columns |
|---|---|---|---|---|---|---|
| 1 | 105 | 200 | 鈉 | 鈉 | 50 | 2 |
| 2 | 300 | 2 | 1 | 1 | 33 | 4 |
| 3 | 20 | 1 | 鈉 | 鈉 | 鈉 | 1 |
我知道我可以計算以特定名稱開頭的列的長度,如下所示:
df[df.columns[pd.Series(df.columns).str.startswith('number')]]
但我不知道,如何添加必須有 NaN 值以外的條件以及如何將其應用于每一行。我認為它可以用 lambda 完成?但還沒有成功。
uj5u.com熱心網友回復:
# filter column on 'number' and count
df['sum_columns']=df.filter(like='number').count(axis=1)
df
id something number1 number2 number3 number4 sum_columns
0 1 105 200 NaN NaN 50.0 2
1 2 300 2 1.0 1.0 33.0 4
2 3 20 1 NaN NaN NaN 1
PS:您的第一個 DF 和第二個 DF,NaN 計數不匹配。我在解決方案中使用了第二個 DF
uj5u.com熱心網友回復:
Indeeddf[df.columns[df.columns.str.startswith('number')]]將為您的資料框提供以 . 開頭的列'number'。現在我們只需要對非 NaN 值的數量求和。這可以這樣做:
df['sum_columns'] = (df[df.columns[df.columns.str.startswith('number')]].notnull()).sum(axis=1)
輸出:
id something number1 number2 number3 number4 sum_columns
0 1 105 200 NaN NaN 50.0 2
1 2 300 2 1.0 1.0 33.0 4
2 3 20 1 NaN NaN NaN 1
uj5u.com熱心網友回復:
import pandas as pd
import numpy as np
df = {'something':[105, 300,20],
'number1':[200,2,1],
'number2':[np.nan,1,np.nan],
'number3':[np.nan,1,np.nan],
'number4':[50,33,np.nan]}
df = pd.DataFrame(df)
tmp = df[df.columns[pd.Series(df.columns).str.startswith('number')]]
df['sum_columns'] = tmp.notnull().sum(axis=1).tolist()
df
輸出:
something number1 number2 number3 number4 sum_columns
0 105 200 NaN NaN 50.0 2
1 300 2 1.0 1.0 33.0 4
2 20 1 NaN NaN NaN 1
uj5u.com熱心網友回復:
可以使用pandas.DataFrame.ilocto,根據列的索引,過濾以考慮所需的列,以及 .count(axis=1),如下
df['sum_columns'] = df.iloc[:, 2:].count(axis=1)
[Out]:
id something number1 number2 number3 number4 sum_columns
0 1 105 200 NaN NaN 50.0 2
1 2 300 2 1.0 1.0 33.0 4
2 3 20 1 NaN NaN NaN 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/525775.html
