एक डेटासेट में, मेरे पास TP1, TP2 आदि नाम के चार कॉलम हैं (टेस्टिंग फेज 1,2... के लिए खड़ा है)। इन कॉलमों में जानकारी निम्न में से एक 5 हो सकती है: Not_tested, Not_ffinish, too_low, 150 और 190 के बीच का मान, और कुछ भी नहीं।

एक तत्व का परीक्षण तब माना जाता है जब वह 4 कॉलम में से किसी में कम से कम एक बार दिखाता है, मान: to_low या 150 और 190 के बीच का मान। यदि इन 2 में से कोई भी उस तत्व के लिए पंक्ति में किसी भी बिंदु पर नहीं दिखाया जाता है, तो यह परीक्षण नहीं माना जाता है।

मुझे कुछ इस तरह की रिपोर्ट करने की ज़रूरत है:

"परीक्षण किए गए तत्वों की संख्या: 43 (और सभी तत्वों से एक प्रतिशत)" (जो too_low या 150 और 190 के बीच का मान दिखाने वाली कितनी पंक्तियों के बराबर है)

"नए परीक्षण किए गए तत्वों की संख्या: # और%" (इसलिए ऊपर पाए गए तत्वों से, जिनके नए कॉलम में हां है?)

"पुराने परीक्षण किए गए तत्वों की संख्या: # और%" (जिनके बजाय नहीं है)

डेटासेट के हिस्से का एक उदाहरण यहां नीचे मौजूद है:

+=======+==========+=====+======+==============+=========+==============+=====+
|  ID   | Location | 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() का उपयोग करना था, लेकिन मैं एक नियम कैसे बना सकता हूं कि इन मूल्यों के साथ मौजूद होने पर ही इसकी गणना की जाती है? क्या मैं डेटाफ्रेम में टी या एफ के साथ एक नया कॉलम जोड़ सकता हूं, इस पर निर्भर करता है कि यह बहुत कम या संख्या (150-190) होने के नियम को पूरा करता है। मैं इस सब के लिए काफी नया हूं और मुझे यकीन नहीं है कि इसके बारे में कैसे जाना है। मैं एक सीधे उत्तर के लिए जरूरी नहीं हूं लेकिन यदि संभव हो तो समस्या पर कुछ मार्गदर्शन, धन्यवाद।

डेटाफ़्रेम:

pd.DataFrame({'ID': {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: '',  1: 'NOT_TESTED',  2: '',  3: 'NOT_FINISHED',  4: '',  5: '',  6: '180',  7: '',  8: '',  9: '',  10: '',  11: '',  12: 'TOO_LOW',  13: '',  14: '155',  15: ''}, 'PT2': {0: '',  1: '',  2: '',  3: '',  4: '',  5: 'TOO_LOW',  6: '',  7: '',  8: '160',  9: 'TOO_LOW',  10: '',  11: '',  12: '',  13: '',  14: '',  15: ''}, 'PT3': {0: '',  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: '',  1: '',  2: '',  3: '',  4: '',  5: 165.0,  6: '',  7: '',  8: '',  9: '',  10: '',  11: '',  12: 180.0,  13: '',  14: '',  15: ''}})
0
Boston Co 29 अगस्त 2021, 13:50

2 जवाब

सबसे बढ़िया उत्तर

आप कुछ इस तरह की कोशिश कर सकते हैं

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', 'PT1', 'PT2', 'PT3', 'PT4'])

# Number of tested elements: 43 (and a percentage from all elements)"
# (which equates to how many rows show too_low or a value between 150 and 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()


#"Number of new tested elements
new_tested_elements = df[filter_ & df['NEW'].eq('YES')].shape[0]


#"Number of old tested elements
old_tested_elements = df[filter_ & df['NEW'].eq('NO')].shape[0]
0
Epsi95 29 अगस्त 2021, 14:52

मुझे लगता है कि आप लाइब्रेरी पंडों से डेटाफ्रेम के साथ काम कर रहे हैं। मुझे एक ही समस्या थी और डेटाफ्रेम के माध्यम से पुनरावृत्त किया गया था। चर df एक डेटाफ़्रेम था जिसे मैंने CSV से पंडों से "read_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

print("Elements satisfying criteria: ", elementsCount)
0
Shira Pugu 29 अगस्त 2021, 14:25