Pandas: удаление дубликатов с использованием date.dt.day в качестве подмножества - PullRequest
0 голосов
/ 17 марта 2020

Фон

Я смотрю на набор данных вируса короны из CSSEGISandData : github.com/CSSEGISandData/COVID-19.git. Данные хранятся в формате CSV, разделенном на день (например, 01-24-2020.csv, 01-25-2020.csv, 01-26-2020.csv).

Я объединил все файлы в один pandas кадр данных, однако имеется дубликатов , как вы можете , см. Ниже со Швецией . Это происходит потому, что когда данные по Швеции не обновляются, файл следующего дня сообщает о последнем обновлении (то есть о последних данных).

             Province/State        Country/Region   Last Update    Confirmed
2229             Tibet        Mainland China 2020-02-01 01:52:40        1.0   
2990           Ningxia        Mainland China 2020-02-01 02:13:00       26.0   
3025               NaN                Sweden 2020-02-01 02:13:00        1.0   #THIS
3023               NaN                 Spain 2020-02-01 02:13:00        1.0   
1847               NaN                Sweden 2020-02-01 02:13:26        1.0   #THIS
5910               NaN                Sweden 2020-02-01 02:13:26        1.0   #THIS
2232               NaN                Sweden 2020-02-01 02:13:26        1.0   #THIS

Цель

Я хочу:

  1. Подмножество данных, основанных на провинции / штате
  2. Если провинция / штат - NaN - > Использовать страну / регион (например, Швеция)
  3. Удалять все дубликаты в подмножествах на основе даты «Последнее обновление» с точной датой дня (исключая час, если в один и тот же день имеется более одного результата)
  4. вернуть фрейм данных

Для адресации 1 и 2 я заполнил NaN провинции / штата значением Country / Region. Как бы это не было идеально, я бы предпочел быть не может заполнить NaN.

Это мой код, но я не могу удалить дубликаты.

!git clone https://github.com/CSSEGISandData/COVID-19.git

#@title Import files csse_covid_19_data { form-width: "10px" }
import pandas as pd 
import glob
path = r'/content/COVID-19/csse_covid_19_data/csse_covid_19_daily_reports' # use your path
all_files = glob.glob(path + "/*.csv") #collect all files in one

li = []

for filename in all_files:
    df = pd.read_csv(filename, index_col=None, header=0)
    df['file']=filename[-14:]
    li.append(df)
frame = pd.concat(li, axis=0, ignore_index=True, sort=False) #one dataframe 


frame['Province/State'].fillna(frame['Country/Region'], inplace=True) #putting the Coutry in teh NaN of Province for data cleanup 

#change the 'Last Update'] to datetime format
frame['Last Update'] = pd.to_datetime(frame['Last Update'])
frame = frame.sort_values(by="Last Update")

РЕДАКТИРОВАТЬ: Решение Curret от: FROM YOBEN_S

Это текущее решение, оно работает, но я заполняю провинцию / штат страной / регионом, а не группируюсь по региону страны, когда штат провинции равен NaN


frame = frame.assign(day=frame['Last Update'].dt.date).\
          drop_duplicates(subset=(['day', 'Province/State'])).drop('day',axis=1)

В идеале я хочу drop_duplicates , используя дату и провинцию / штат в качестве подпрограмм Это означает, что когда провинция / штат имеет значение NaN, переключитесь на регион страны

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Отрегулируйте свой последний ряд

#Since NaN ==NaN return False, so 
frame.fillna('Not Ava',inplace=True)
frame = frame.assign(day=frame['Last Update'].dt.date).\
          drop_duplicates(subset=(['day', 'Country/Region'])).drop('day',axis=1)
0 голосов
/ 17 марта 2020

Вы также можете использовать логическое индексирование:

frame[frame['Last Update'].dt.normalize().duplicated() 
      & frame['Country/Region'].duplicated()]

Обратите внимание, что frame['Last Update'].dt.day дает вам только число в номере и игнорирует год / месяц. Это может или не может быть то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...