下面,我有一個表,其中列TST1到TST5可以不取值或取以下之一。NOT_DONE INCOMP UNTESTED 30 35 40 45 50
我需要從下表中計算被驗證的元素(行)的數量。
一個元素被認為是有效的,當最右邊的值是30和50之間的一個(用5隔開,所以30,35,40...)。這意味著如果該行從TST1到TST5都沒有任何數值,那么就不會被計算在內。如果在NOT_DONE INCOMP或UNTESTED的左邊發現一個數值,那么它就不會被驗證。
換句話說,我需要從右到左計算每一行的數量。
例如,從下面的表格中,只有6個元素被認為是有效的。
最后,我需要計算其中有多少屬于 A 組或 B 組。
我最初的想法是創建一個包含所有已驗證元素的新列來解決這個問題,但我真的不確定該如何做。
我正在使用 python 2.7 和 pandas 0.24.2。我是這方面的新手,如果有任何幫助或指導,我將不勝感激。
------- ---------- ---------- ---------- -------- ----------
|組 | TST1 | TST2 | TST3 | TST4 | TST5 |
------- ---------- ---------- ---------- -------- ----------
| A | NOT_DONE | | 50 !
------- ---------- ---------- ---------- -------- ----------
| A | | 35 | | |
------- ---------- ---------- ---------- -------- ----------
| B | | | | | |
------- ---------- ---------- ---------- -------- ----------
| a | | incomp | | |
------- ---------- ---------- ---------- -------- ----------
| B | UNTESTED | | 50 | INCOMP | !
------- ---------- ---------- ---------- -------- ----------
| B | | | | | |
------- ---------- ---------- ---------- -------- ----------
| B | | 30 | | !
------- ---------- ---------- ---------- -------- ----------
| A | INCOMP | 40 | | |
------- ---------- ---------- ---------- -------- ----------
| B | | | | 未測驗 |
------- ---------- ---------- ---------- -------- ----------
| A | | | | | |
------- ---------- ---------- ---------- -------- ----------
| b | | incomp | | |
------- ---------- ---------- ---------- -------- ----------
| A | | | | | |
------- ---------- ---------- ---------- -------- ----------
| B | | 50 | | | | |
------- ---------- ---------- ---------- -------- ----------
| B | | UNTESTED | 35 | NOT_DONE |
------- ---------- ---------- ---------- -------- ----------
| B | | | | | |
------- ---------- ---------- ---------- -------- ----------
| A | 40 | | INCOMP | !
------- ---------- ---------- ---------- -------- ----------
30 | | 30 | |
------- ---------- ---------- ---------- -------- ----------
| B | | | | | |
------- ---------- ---------- ---------- -------- ----------
| B | | NOT_DONE | 30 | NOT_DONE |
------- ---------- ---------- ---------- -------- ----------
編輯: 這就是我所嘗試的,但是它計算的是所有呈現數值的行,而不是最右邊的數值的行。我真的不知道如何從右邊開始選擇。
filter1 = df.loc[:, 'TST1'/span>:'TST5'/span>] .
.apply(lambda x: x.astype(str) 。 str.match(r'd .*d*'), axis=0)
.any(axis=1)
number_validated = filter1.sum()
print "number of validated items: ", number_validated
預期的輸出應該只是一個簡短的文本摘要:
已驗證專案的數量。5
A組有效專案的數量。4
B組驗證專案的數量。2 2
uj5u.com熱心網友回復:
另一個選項,在python 2.7.18和pandas 0.24.2上測驗(盡管它在python 3中作業正常):
使用ffill來提取最右邊的值,并使用to_numeric來將其脅迫成數字:
rightmost = df.filter(like='TST'/span>)。 ffill(axis='columns').iloc[:, -1]
rightmost = pd.to_numeric(rightmost, errors='coerce')
# 0 NaN[/span
# 1 35.0[/span]。
# 2 NaN
# 3 NaN # 3 NaN
# 4 NaN # 4 NaN
# 5 NaN # 5 NaN
# 6 30.0[/span]。
# 7 40.0 # 6 40.0
# 8 NaN
# 9 NaN # 9 NaN
# 10 NaN # 10 NaN
# 11 NaN # 11 NaN
# 12 50.0
# 13 NaN
# 14 NaN # 13 NaN
# 15 NaN # 15 NaN
# 16 30.0
# 17 NaN
# 18 NaN # 18 NaN?
# Name: TST5, dtype: float64
然后groupby的Group,并檢查它們是否介于30和50(包括):
valid = rightmost.groupby(df.Group).apply(
lambda g: g.between(30, 50, inclusive='both') .sum()
).to_frame('Valid')
# Valid[/span]。
# Group
# A 3 # A 3
# B 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/309335.html
標籤:
