在一個資料集中,我有四列名為TP1、TP2等(代表測驗階段1、2...)。這些列中的資訊可以是以下5種情況之一:未測驗、未完成、太低、數值在150和190之間,以及沒有。
當一個元素在4列中的任何一列中至少顯示一次數值:too_low或150和190之間的數值時,它被認為是經過測驗的。如果這兩個值在該元素的行中的任何一點都沒有顯示,那么它就被認為沒有被測驗。
我需要報告的內容是: "已測驗元素的數量。43(以及所有元素的百分比)"(這相當于有多少行顯示too_low或150和190之間的值) "新測驗的元素數量:43(以及所有元素的百分比)"(這相當于有多少行顯示too_low或150和190之間的值) "新測驗元素的數量。#和%" (所以從上面發現的元素中,哪些元素在NEW列中有YES?) "舊的測驗元素的數量。#和%" (這些元素有一個NO代替)
下面是部分資料集的例子:
======= ========== ===== ====== ============== ========= ============== =====
| ID | 位置 | NEW | YEAR | PT1 | PT2 | PT3 | PT4 !
======= ========== ===== ====== ============== ========= ============== =====
| GF342 | Q1 | YES | 2021 | | | | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| IF874 | Q3 | NO | 2018 | NOT_TESTED | | TOO_LOW | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| FH386 | Q1 | NO | 2019 | | | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| KJ190 | Q3 | YES | 2021 | NOT_FINISHED | | TOO_LOW | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| TY748 | Q3 | YES | 2021 | | | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| YT947 | Q4 | NO | 2019 | | TOO_LOW | | 165 !
------- ---------- ----- ------ -------------- --------- -------------- -----
| DF063 | Q3 | NO | 2019 | 180 | | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| ET512 | Q1 | YES | 2021 | | | | | |
------- ---------- ----- ------ -------------- --------- -------------- -----
| GC714 | Q2 | NO | 2018 | | 160 !
------- ---------- ----- ------ -------------- --------- -------------- -----
| SD978 | Q3 | NO | 2019 | | TOO_LOW | | | |
------- ---------- ----- ------ -------------- --------- -------------- -----
| EF472 | Q1 | NO | 2018 !
------- ---------- ----- ------ -------------- --------- -------------- -----
| PL489 | Q2 | YES | 2021 | | NOT_FINISHED | |
------- ---------- ----- ------ -------------- --------- -------------- -----
| AZ315 | Q1 | NO | 2018 | TOO_LOW | | 180 !
------- ---------- ----- ------ -------------- --------- -------------- -----
| OL821 | Q1 | YES | 2021 | | 185 | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| HN765 | Q3 | YES | 2021 | 155 | | !
------- ---------- ----- ------ -------------- --------- -------------- -----
| ED589 | Q1 | YES | 2021 | | 165 | !
------- ---------- ----- ------ -------------- --------- -------------- -----
我解決這個問題的想法是使用包含必要值的所有行的.sum(),但我如何制定一個規則,只有在出現這些值時才會被計算在內?我是否可以在資料框架中添加一個新的列,根據它是否滿足too_low或一個數字(150-190)的規則,使用T或F。我對這一切都很陌生,不知道該如何去做。我不一定要一個直接的答案,但如果可能的話,我希望在這個問題上得到一些指導,謝謝你。
Dataframe:
pd.DataFrame({'ID'/span>: {0: 'GF342', 1: 'IF874', 2: 'FH386', 3: 'KJ190', 4: 'TY748', 5: 'YT947', 6: 'DF063', 7: 'ET512', 8: 'GC714', 9: 'SD978', 10: 'EF472', 11: 'PL489', 12: 'AZ315', 13: 'OL821', 14: 'HN765', 15: 'ED589'}, 'Location': {0: 'Q1', 1: 'Q3', 2: 'Q1', 3: 'Q3', 4: 'Q3', 5: 'Q4', 6: 'Q3', 7: 'Q1', 8: 'Q2', 9: 'Q3', 10: 'Q1', 11: 'Q2', 12: 'Q1', 13: 'Q1', 14: 'Q3', 15: 'Q1'}, 'new': {0: 'yes', 1: 'NO', 2: 'NO', 3: 'YES', 4: 'YES', 5: 'NO', 6: 'NO', 7: 'YES', 8: 'NO', 9: 'NO', 10: 'NO', 11: 'YES', 12: 'NO', 13: 'YES', 14: 'YES', 15: 'YES'}, 'YEAR': {0: 2021, 1: 2018, 2: 2019, 3: 2021, 4: 2021, 5: 2019, 6: 2019, 7: 2021, 8: 2018, 9: 2019, 10: 2018, 11: 2021, 12: 2018, 13: 2021, 14: 2021, 15: 2021}, 'PT1': {0: ''/span>, 1: 'NOT_TESTED', 2: '', 3: 'NOT_FINISHED', 4: '', 5: '', 6: '180', 7: '', 8: '', 9: '', 10: '', 11: '', 12: 'TOO_LOW', 13: '', 14: '155', 15: ''/span>}, 'PT2': {0: ''/span>, 1: ''/span>, 2: ''/span>, 3: '', 4: ''/span>, 5: 'TOO_LOW', 6: '', 7: '', 8: '160', 9: 'TOO_LOW', 10: '', 11: '', 12: '', 13: '', 14: '', 15: ''/span>}, 'PT3': {0: ''/span>, 1: 'TOO_LOW', 2: '', 3: 'TOO_LOW', 4: '', 5: '', 6: '', 7: '', 8: '', 9: '', 10: '', 11: 'NOT_FINISHED', 12: '', 13: '185', 14: '', 15: '165'}, 'PT4': {0: ''/span>, 1: ''/span>, 2: ''/span>, 3: '', 4: ''/span>, 5: 165.0, 6: ''/span>, 7: '', 8: '', 9: '', 10: '', 11: '', 12: 180.0, 13: ''/span>, 14: '', 15: ''}})
uj5u.com熱心網友回復:
我想你是在用Pandas庫中的DataFrame作業。我有一個類似的問題,并在資料框架中進行了迭代。變數df是我用Pandas的 "read_csv "方法從CSV中提取的一個資料框架。我不知道你是如何得到資料集的,但它應該是類似的格式。我希望它對你有用,或者至少你能得到一個方法
。tooLow = "TOO_LOW"
elementsCount = 0
index = len(df.columns)
for r in range(len(df.index) )。
for c in range(index)。
columnValue = df.at[r, df.columns[c]]
if (150 <= columnValue <= 190) or (columnValue == tooLow)。
elementsCount = 1 or (columnValue == tooLow): elementsCount = 1
print("滿足條件的元素。", elementsCount)
uj5u.com熱心網友回復:
你可以試試這樣的方法
df = pd. DataFrame([['NO', 'NOT_TESTED', None, 'TOO_LOW', None],
['YES', 'NOT_FINISHED', None, 'TOO_LOW', None] 。
['YES', None, None, None, None],
['NO', 180, None, None, None] 。
['NO', 'TOO_LOW', None, None, 180] 。
['YES', 155. 6, None, None, None]], columns=['NEW'/span>, 'PT1'/span>, 'PT2'/span>, 'PT3'/span>, 'PT4'/span>])
# 測驗元素的數量。43(和所有元素的百分比)"
# (這相當于有多少行顯示too_low或數值在150和190之間)。
filter_ = df.loc[:, 'PT1':'PT4'] 。
.apply(lambda x: x.eq('TOO_LOW') | x.astype(str) 。 str.fullmatch(r'd .*d*'), axis=0)
.any(axis=1)
number_of_tested = filter_.sum()
#"新測驗元素的數量"。
new_tested_elements = df[filter_ & df['NEW'].eq('YES')].shape[0]
#"舊測驗元素的數量
old_tested_elements = df[filter_ & df['NEW'].eq('NO') ].shape[0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/309347.html
標籤:
