टीएल, डीआर:
मेरे पास एक डेटासेट है जो कुल कोविड टीकाकरण दिखा रहा है। मैंने इस डेटा को देश और तारीख के अनुसार समूहीकृत किया है। हालाँकि कुछ देशों में कुछ तिथियों के लिए कोई प्रविष्टियाँ नहीं हैं (ना या NaN नहीं, केवल गैर-मौजूद रिकॉर्ड)।
मैं चाहता हूं कि प्रत्येक देश के पास मेरे डेटासेट की संपूर्ण तिथि सीमा के लिए कुल टीकाकरण का मूल्य हो, स्वाभाविक रूप से इसे किसी भी तारीख के लिए 0 से भरना है जिसमें वर्तमान में कोई डेटा नहीं है।
इसे हासिल करने का सबसे आसान तरीका क्या है? मुझे लगता है कि यह एक बहुत ही मामूली सवाल है, लेकिन मैं सिर्फ अजगर और पांडा से शुरू कर रहा हूं।
अधिक विवरण में:
मैं निम्नलिखित डेटासेट का उपयोग कर रहा हूं: https://www.kaggle.com/ gpreda/covid-world-वैक्सीनेशन-प्रगति। मैं इसे एक पांडा डेटाफ्रेम में जोड़ता हूं:
covid_df = pd.read_csv('country_vaccinations.csv', parse_dates=True)
मैं देश और तारीख के आधार पर डेटासेट को समूहीकृत कर रहा हूं और कुल टीकाकरण का योग कर रहा हूं:
grouped_country_df = covid_df[['country','total_vaccinations','date']].
groupby(['country','date'], as_index = False).sum('total_vaccinations')
हालाँकि, मुझे कुछ ऐसे देशों के साथ छोड़ दिया जाता है जो बस कुछ तिथियों के लिए नहीं दिखते हैं - वे NaN या NA नहीं हैं, वे बस मौजूद नहीं हैं।
उदाहरण के लिए:
print(len(grouped_country_df['date'][grouped_country_df['country'] == 'United States']))
print(len(grouped_country_df['date'][grouped_country_df['country'] == 'China']))
print(len(grouped_country_df['date'][grouped_country_df['country'] == 'United Kingdom']))
रिटर्न:
51
51
57
मुझे लगता है कि ऐसा इसलिए है क्योंकि यूके ने अन्य सभी की तुलना में पहले टीकाकरण शुरू कर दिया था, इसलिए टीकाकरण प्रक्रिया की शुरुआत में चीन और अमेरिका के लिए कोई रिकॉर्ड नहीं है। तो बाद की तारीखों के लिए, वे "NaN" के रूप में दिखाई देते हैं, जो कि fillna() का उपयोग करके 0s से भरना आसान है, लेकिन पहले की तारीखों के लिए मुझे यकीन नहीं है कि क्या करना है।
मेरी बात को और स्पष्ट करने के लिए मूल covid_df डेटाफ़्रेम से संयुक्त राज्य अमेरिका के लिए एक उदाहरण यहां दिया गया है:
covid_df[['country','total_vaccinations','date']][covid_df['country'] == 'United States']
country total_vaccinations date
2447 United States 556208.0 2020-12-20
2448 United States 614117.0 2020-12-21
2449 United States NaN 2020-12-22
2450 United States 1008025.0 2020-12-23
2451 United States NaN 2020-12-24
2452 United States NaN 2020-12-25
2453 United States 1944585.0 2020-12-26
2454 United States NaN 2020-12-27
2455 United States 2127143.0 2020-12-28
जैसा कि आप देख सकते हैं, संयुक्त राज्य अमेरिका में '2020-12-20' से पहले की तारीखों के लिए कोई प्रविष्टि नहीं है, इसलिए fillna() भरने के लिए कुछ भी नहीं है।
मैं निम्नलिखित समाधान के साथ आया जो काम करता है, लेकिन मुझे पूरा यकीन है कि यह बहुत ही सुरुचिपूर्ण है, और मुझे यकीन है कि चेहरे पर मुझे घूरने का एक अविश्वसनीय रूप से सरल समाधान है:
new_country_df = pd.DataFrame()
for country in grouped_covid_countries_df['country'].values:
dates_df = grouped_covid_countries_df['date'].to_frame().drop_duplicates()
country_df = grouped_covid_countries_df[['date','total_vaccinations','country']][grouped_covid_countries_df['country'] == country].drop_duplicates()
temp_df = dates_df.merge(country_df, on='date', how='left').fillna(0)
temp_df['country'] = country
new_country_df = pd.concat([new_country_df, temp_df])
new_country_df['date'][new_country_df['country'] == 'United States']
मुझे इसे हासिल करने का कारण यह है कि मैं समय के साथ कुल टीकाकरण की साजिश रचने वाला एक स्टैक्ड बार चार्ट बनाना चाहता हूं, लेकिन मुझे त्रुटियां मिलती हैं यदि प्रत्येक देश के मूल्य में प्रत्येक तिथि के लिए कोई प्रविष्टि नहीं है, जब "नीचे" की गणना करने का प्रयास किया जाता है। matplotlib.pyplot.bar() विधि का तर्क:
bottom = len(new_country_df['date'].value_counts()) * [0]
plt.figure(figsize=(10,5))
for country in new_country_df['country'].unique():
x = new_country_df['date'][new_country_df['country'] == country]
y = new_country_df['total_vaccinations'][new_country_df['country'] == country]
plt.gca().xaxis.set_major_formatter(dates.ConciseDateFormatter(dates.AutoDateLocator()))
plt.bar(x,y, label=country, bottom=bottom)
bottom = bottom + new_country_df['total_vaccinations'][new_country_df['country'] == country]
plt.gca().legend(loc = 'upper left')
पढ़ने के लिए धन्यवाद! मुझे आशा है कि मेरा प्रश्न स्पष्ट था, कृपया उन तरीकों पर प्रतिक्रिया देने के लिए स्वतंत्र महसूस करें जिनसे मैं इसे सुधार सकता हूं या इसे फिर से लिख सकता हूं।
1 उत्तर
डेटाफ़्रेम को फिर से आकार देने का तरीका अपनाएं और यह fillna()
उचित रूप से उपयोग करने का सरल मामला बन जाता है
import pandas as pd
import numpy as np
from pathlib import Path
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
df = pd.read_csv(list(Path.cwd().glob("cou*.csv"))[0])
df.date = pd.to_datetime(df.date)
dfv = df.loc[:,["country","date","total_vaccinations"]]
fig, ax = plt.subplots(figsize=[14,6])
# let's look for interesting places that have got ahead on vacinations
dfbig = dfv.groupby("country", as_index=False).agg({"total_vaccinations":"max"}).query("total_vaccinations.gt(2000000)")
# group together smaller numbers into "Others". It's important that zero is replaced with NaN
dfv = dfv.assign(country=np.where(dfv.country.isin(dfbig.country), dfv.country, "Other")).groupby(["country","date"], as_index=False).sum().replace({0:np.nan})
# post unstack() every country will have same number of dates. ffill blanks, then put zeros at beginning of series
dfp = dfv.set_index(["country","date"]).unstack(0).droplevel(0, axis=1).fillna(method="ffill").fillna(0)
bottom = np.zeros(len(dfp))
for c in dfp.columns:
plt.bar(dfp.index, dfp[c], label=c, bottom=bottom)
bottom = bottom + dfp[c].values
plt.gca().legend(loc = 'upper left')
plt.gca().xaxis.set_major_formatter(mdates.ConciseDateFormatter(mdates.AutoDateLocator()))
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।