टीएल, डीआर:

मेरे पास एक डेटासेट है जो कुल कोविड टीकाकरण दिखा रहा है। मैंने इस डेटा को देश और तारीख के अनुसार समूहीकृत किया है। हालाँकि कुछ देशों में कुछ तिथियों के लिए कोई प्रविष्टियाँ नहीं हैं (ना या 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')

enter image description here

पढ़ने के लिए धन्यवाद! मुझे आशा है कि मेरा प्रश्न स्पष्ट था, कृपया उन तरीकों पर प्रतिक्रिया देने के लिए स्वतंत्र महसूस करें जिनसे मैं इसे सुधार सकता हूं या इसे फिर से लिख सकता हूं।

0
Louis 18 फरवरी 2021, 15:44

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()))

enter image description here

0
Rob Raymond 18 फरवरी 2021, 19:25
धन्यवाद रोब। मेरी समस्या का वास्तव में संतोषजनक और सुरुचिपूर्ण समाधान। इसके अलावा यह अन्य अनसुलझे मुद्दे को भी हल करता है जो मेरे पास कुल_वैक्सीनेशन के दिनों में बिना किसी रिकॉर्ड के 0 पर वापस सेट किया जा रहा था। मुझे वास्तव में पूरी तारीखों की सीमा में देशों को प्राप्त करने के लिए set_index + unpack का उपयोग करने का विचार पसंद है, फिर सभी शून्य को रिक्त स्थान से बदलना, फिर उक्त रिक्त स्थान से छुटकारा पाने के लिए ffill का उपयोग करना, और अंत में पूरी तस्वीर प्राप्त करने के लिए भरना। इसे पढ़कर मैंने बहुत कुछ सीखा।
 – 
Louis
19 फरवरी 2021, 18:35