मुझे वास्तव में कुछ मदद की ज़रूरत है और मुझे नहीं पता कि इस बारे में कैसे जाना है। मैं कोडिंग के लिए काफी नया हूँ।

मेरे पास इंपीरियल काउंटी में कैलेक्सिको, सीए के लिए प्रति घंटा ओजोन, सीओ, हवा और तापमान डेटा का एक वर्ष (2018) है और मैं प्रत्येक दिन के लिए ओजोन के अधिकतम दैनिक 8-घंटे औसत (एमडीए8) की कुशलतापूर्वक गणना करने की कोशिश कर रहा हूं। मैंने अपना डेटाफ्रेम दोहराया है:

import pandas as pd
df = pd.DataFrame({'date': ['1-1-2018 00:00:00', '1-1-2018 01:00:00', '1-1-2018 02:00:00', '1-1-2018 03:00:00', '1-1-2018 04:00:00', '1-1-2018 05:00:00', '1-1-2018 06:00:00', '1-1-2018 07:00:00',
                                '1-1-2018 08:00:00', '1-1-2018 09:00:00', '1-1-2018 10:00:00', '1-1-2018 11:00:00', '1-1-2018 12:00:00', '1-1-2018 13:00:00', '1-1-2018 14:00:00', '1-1-2018 15:00:00',
                                '1-1-2018 16:00:00', '1-1-2018 17:00:00', '1-1-2018 18:00:00', '1-1-2018 19:00:00', '1-1-2018 20:00:00', '1-1-2018 21:00:00', '1-1-2018 22:00:00', '1-1-2018 23:00:00',
                                '1-2-2018 00:00:00', '1-2-2018 01:00:00', '1-2-2018 02:00:00', '1-2-2018 03:00:00', '1-2-2018 04:00:00', '1-2-2018 05:00:00', '1-2-2018 06:00:00', '1-2-2018 07:00:00',
                                '1-2-2018 08:00:00', '1-2-2018 09:00:00', '1-2-2018 10:00:00', '1-2-2018 11:00:00', '1-2-2018 12:00:00', '1-2-2018 13:00:00', '1-2-2018 14:00:00', '1-2-2018 15:00:00',
                                '1-2-2018 16:00:00', '1-2-2018 17:00:00', '1-2-2018 18:00:00', '1-2-2018 19:00:00', '1-2-2018 20:00:00', '1-2-2018 21:00:00', '1-2-2018 22:00:00', '1-2-2018 23:00:00'],
                   'ozone': [30.0, 32.1, 33.5, 33.7, 35.6, 34.8, 35.2, 36.1, 36.1, 36.3, 36.5, 37.2, 38.4, 39.9, 40.0, 42.1, 43.4, 42.5, 41.0, 40.0, 38.6, 36.6, 36.1, 36.6,
                             35.4, 33.0, 31.5, 32.6, 33.0, 33.8, 34.2, 35.1, 35.6, 36.2, 36.9, 37.5, 37.9, 38.3, 39.5, 40.5, 41.4, 42.8, 44.6, 44.0, 43.8, 42.1, 40.2, 39.9],
                   'temperature': [12.2, 12.2, 12.4, 12.1, 12.3, 12.5, 12.6, 12.8, 12.9, 13.1, 13.2, 13.4, 13.6, 13.7, 13.9, 13.9, 13.5, 13.2, 13.1, 13.1, 12.8, 12.8, 12.7, 12.7,
                                   12.6, 12.4, 12.4, 12.3, 12.1, 12.5, 12.7, 12.7, 12.9, 13.0, 13.0, 13.3, 13.5, 13.6, 13.8, 13.9, 14.0, 13.9, 13.7, 13.6, 13.4, 13.1, 12.9, 12.8],
                   'wind speed': [3.1, 3.2, 3.3, 3.3, 2.3, 3.4, 3.4, 2.1, 3.6, 3.6, 3.5, 3.2, 3.1, 2.8, 2.7, 2.9, 2.4, 2.6, 2.4, 2.1, 2.5, 2.7, 2.3, 2.2, 
                                  2.5, 2.8, 2.5, 2.6, 2.4, 2.3, 5.1, 5.5, 5.2, 4.6, 4.1, 3.1, 3.2, 3.1, 3.2, 3.4, 3.1, 3.5, 3.7, 3.4, 3.2, 3.1, 3.5, 3.4],
                   'CO': [0.33, 0.31, 0.31, 0.34, 0.35, 0.31, 0.31, 0.33, 0.30, 0.29, 0.28, 0.28, 0.27, 0.24, 0.21, 0.22, 0.23, 0.25, 0.21, 0.28, 0.31, 0.23, 0.31, 0.29,
                          0.33, 0.31, 0.31, 0.34, 0.35, 0.31, 0.31, 0.33, 0.30, 0.29, 0.28, 0.28, 0.27, 0.24, 0.21, 0.22, 0.23, 0.25, 0.21, 0.28, 0.31, 0.23, 0.31, 0.29]}, 
                  index=['date'])

मैंने एक कोड बनाया जिसने ओजोन के लिए 8 घंटे के रोलिंग माध्य की गणना की और दैनिक अधिकतम पाया:

df['O3_mda8_3135'] = df.ozone.rolling('8H', min_periods=2).mean().shift(-4)
O3_mda8_3135 = df.groupby([date.month,date.day])['O3_mda8_3135'].max()

हालाँकि, अपने नए डेटाफ़्रेम में, मैं तापमान, CO, और हवा के मान उस दिन से जब ओजोन अधिकतम होता है चाहता हूँ। मुझे यकीन नहीं है कि यह कैसे करें। बहुत छोटे डेटाफ़्रेम के लिए, मैंने कोशिश की है: np.isclose(df['O3_mda8_3135'], #####).argmax() लेकिन मैं इसे वर्ष के प्रत्येक दिन के लिए व्यक्तिगत रूप से नहीं कर सकता, विशेष रूप से इस अवसर पर कि दोहराए जाने वाले मूल्य हैं। क्या शायद किसी प्रकार का लूप कोड है जिसे मैं अधिकतम ओजोन सांद्रता की पंक्ति को एक नए डेटाफ़्रेम में खींचने की कोशिश कर सकता हूं और ओजोन की अधिकतम 365 पंक्तियाँ अधिकतम दैनिक 8-घंटे औसत, सीओ, हवा और तापमान हैं?

मैं चाहता हूं कि नया डेटाफ्रेम हो:

df2 = pd.DataFrame({'date': ['1-1-2018 17:00:00', '1-2-2018 19:00:00'],
                    'ozone': [43.4, 44.6],
                    'temperature': [13.5, 13.7],
                    'wind speed': [2.4, 3.7],
                    'CO': [0.23, 0.21]})

ओजोन कॉलम से खींचे गए अधिकतम मूल्यों के आधार पर, लेकिन उस अधिकतम मूल्य पर संबंधित डेटाटाइम के मूल्यों को दिखा रहा है।

अद्यतन करें: मुझे यह फ़ंक्शन मिला df.groupby([date.month, date.day])[O3_mda8_3135].idxmax(axis='columns') जो मुझे अधिकतम ओजोन मूल्यों का डेटाटाइम टिकट देता है, हालांकि, यह केवल मुझे समय टिकट दिखाता है और मैं संबंधित पंक्ति से सभी विशेषताओं को निकालना चाहता हूं।

1
Heather 20 जिंदा 2021, 22:27

2 जवाब

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

GroupBy ऑब्जेक्ट्स के लिए एक idxmax() (और idxmin()) विधि है जिसका उपयोग प्रत्येक समूह के भीतर अधिकतम की अनुक्रमणिका को वापस करने के लिए किया जा सकता है। आप इसका उपयोग अपने मूल डेटा को अनुक्रमित करने के लिए कर सकते हैं:

>>> df.loc[df.groupby([df['date'].dt.date])['O3_mda8_3135'].idxmax()]

                  date  ozone  temperature  wind speed    CO  O3_mda8_3135
16 2018-01-01 16:00:00   43.4         13.5         2.4  0.23       40.9375
42 2018-01-02 18:00:00   44.6         13.7         3.7  0.21       42.4250

तिथियां आपके द्वारा वर्णित आउटपुट से मेल नहीं खातीं, लेकिन मुझे लगता है कि ये सही हैं?

साथ ही मैं dt.month और dt.day के बजाय यहां dt.date विशेषता का उपयोग करके groupby कर रहा हूं।

2
Tom 21 जिंदा 2021, 01:42

जिस तरह से आपने प्रश्न पोस्ट किया है, उसके कारण मैं आपके डेटा को दोहरा नहीं सकता, या आपके वांछित आउटपुट को स्पष्ट नहीं कर सकता, लेकिन मुझे लगता है कि यह निम्न कोड आपको जो चाहिए वह आपको करीब ले जाएगा:

नीचे दिया गया कोड संभावित रूप से आपको दैनिक max() मान देगा, और आपके द्वारा एक नए डेटाफ़्रेम में उल्लिखित कॉलम भी प्राप्त करेगा

O3_mda8_3135 = (df.groupby([date.month,date.day]).agg({'O3_mda8_3135':'max','TEMP_col':'first','CO_col':'first','WIND_col':'first'}).reset_index())

ध्यान दें कि, 'TEMP_col', 'CO_col','WIND_col' जो मैंने वहां लिखा है, को क्रमशः आपके तापमान / CO / पवन स्तंभों के वास्तविक कॉलम नामों से बदल दिया जाना चाहिए।

1
sophocles 20 जिंदा 2021, 22:35