Python 基于多列在两个具有不同形状的数据帧之间减去多列
我正在查看JHU的以下三个数据集 表格上有哪些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
'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) 如果省和国家/地区列匹配,则doactive=已确认-(已恢复+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'
。