Python 基于多列在两个具有不同形状的数据帧之间减去多列

Python 基于多列在两个具有不同形状的数据帧之间减去多列,python,pandas,Python,Pandas,我正在查看JHU的以下三个数据集 表格上有哪些 'Province/State 'Country/Region 'Lat' 'Long' '1/22/20' '1/23/20' ... NaN Italy x y 0 0 我想根据公式active=confirm-(recovered+deahts) 在数据集具有相同形状之前,我可以执行以下操作 d

我正在查看JHU的以下三个数据集

表格上有哪些

 'Province/State   'Country/Region    'Lat'    'Long'   '1/22/20'    '1/23/20' ...
       NaN               Italy          x        y          0            0
我想根据公式
active=confirm-(recovered+deahts)

在数据集具有相同形状之前,我可以执行以下操作

df_active = df_confirmed.copy()
df_active.loc[4:] = df_confirmed.loc[4:]-(df_recovered.loc[4:]+df_deaths.loc[4:])
## append all shape[1] to list
df_shape_list.append(df_confirmed.shape[1])
...  
min_common_columns = min(df_shape_list)
现在它们不包含相同国家的数据,也不总是有相同数量的日期列

所以我需要做以下几点

df_active = df_confirmed.copy()
df_active.loc[4:] = df_confirmed.loc[4:]-(df_recovered.loc[4:]+df_deaths.loc[4:])
## append all shape[1] to list
df_shape_list.append(df_confirmed.shape[1])
...  
min_common_columns = min(df_shape_list)
1) 确定所有3个DF的共同日期列

2) 如果省和国家/地区列匹配,则do
active=已确认-(已恢复+deahts)

对于第1点),我可以做以下几点

df_active = df_confirmed.copy()
df_active.loc[4:] = df_confirmed.loc[4:]-(df_recovered.loc[4:]+df_deaths.loc[4:])
## append all shape[1] to list
df_shape_list.append(df_confirmed.shape[1])
...  
min_common_columns = min(df_shape_list)
所以我需要减去列
4:min\u common\u列
,但是如果省和国家列在所有3个DF上都匹配,我该如何做呢?

考虑将它们的宽数据转换为长格式,然后再转换为位置和日期。然后运行所需的公式:

from functools import reduce
import pandas as pd

df_confirmed = pd.read_csv("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/"
                           "csse_covid_19_time_series/time_series_covid19_confirmed_global.csv")

df_deaths = pd.read_csv("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/"
                        "csse_covid_19_time_series/time_series_covid19_deaths_global.csv")

df_recovered = pd.read_csv("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/"
                           "csse_covid_19_time_series/time_series_covid19_recovered_global.csv")


# MELT EACH DF IN LIST COMPREHENSION
df_list = [df.melt(id_vars = ['Province/State', 'Country/Region', 'Lat', 'Long'],
                   var_name = 'Date', value_name = val) 
           for df, val in zip([df_confirmed, df_deaths, df_recovered], 
                              ['confirmed', 'deaths', 'recovered'])]

# CHAIN MERGE
df_long = reduce(lambda x,y: pd.merge(x, y, on=['Province/State', 'Country/Region', 'Lat', 'Long', 'Date']),
                 df_list)

# SIMPLE ARITHMETIC
df_long['active'] = df_long['confirmed'] - (df_long['recovered'] + df_long['deaths'])
输出(按活动降序排序)


嗨,这看起来很棒。如何做到这一点,但有一个单独的df活动?我将每个DF作为一个单独的DF,其中一列表示案例类型,即“案例类型”=“活动”。在此处拆分最终数据帧。请参见以拾取列。避免跨数据帧而在数据帧内运行计算,因此我们在这里按位置和时间将三者合并在一起。事实上,这个结果可以说是一个更丰富的数据集,有额外的字段来执行其他操作或分析。我将继续使用df_long方法。但是,删除行是不好的。df_列表中的确认和死亡数据框有17920行。已恢复的有16940行,df_long有16660行。我仍然需要保存恢复后没有任何值的行,并用NaN或类似值填充它。否则我将丢失有价值的数据。只需添加默认值为
how='outer'
how='inner'