Pandas行间减法

2024-09-29 23:27:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试解析csv文件并打印某些时间序列图

关于csv文件:csv文件包含大量数据,我需要根据for循环中的id处理对其的确认。csv文件如下所示:

ID,name,date,confirmedInfections
DE2,BAYERN,2020-02-24,19
DE2,BAYERN,2020-02-25,19
DE2,BAYERN,2020-02-26,21
DE1,BADEN-WÃœRTTEMBERG,2020-02-24,1
DE1,BADEN-WÃœRTTEMBERG,2020-02-25,3
DE1,BADEN-WÃœRTTEMBERG,2020-02-26,7

从该文件中,我需要解析每一行并减去confirmedInfections,以便找到每日感染。在这个时刻,如果我选择一个有ID DE2 and date 2020-03-01的城市,感染是从乞讨到我选择的那一天的总和。所以,我需要编辑这个文件,以便减去并找到日常案例,以打印适当的时间序列。为了达到减法的目的,我找到了pandas.shift(1)方法,但它似乎不起作用

我的代码:

def main(file):
    id_array = ['DE2', 'DE1']
    df = pd.read_csv(file, header='infer', parse_dates=['date'])
    for key in id_array:
        if (df.loc[df['ID'] == key]):
            df['confirmedInfections'] = df['confirmedInfections']-df['confirmedInfections'].shift(1)
    print(df)


main('data.txt')

所需输出:

#For DE2
ID,name,date,confirmedInfections
DE2,BAYERN,2020-02-24,19
DE2,BAYERN,2020-02-25,0
DE2,BAYERN,2020-02-26,2

#For DE1
ID,name,date,confirmedInfections
DE1,BADEN-WÃœRTTEMBERG,2020-02-24,1
DE1,BADEN-WÃœRTTEMBERG,2020-02-25,2
DE1,BADEN-WÃœRTTEMBERG,2020-02-26,4

我得到的错误:

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

有什么想法吗


Tags: 文件csvnameiddffordate时间
2条回答

您可以使用diff()来解决问题,而不是使用shift()。对于其他部分,这可能不是最理想的解决方案,但应该可以完成工作。由于您的问题中只有两个ID,并且您希望为这两个ID创建单独的数据帧,因此我建议先创建两个数据帧:

df = pd.read_csv(file_name_with_path, header='infer', parse_dates=['date'])
#since there are only two IDs you can do it this way else there might be some commplex solutions 
df_DE1 = df.loc[df.ID == 'DE1']
df_DE2 = df.loc[df.ID == 'DE2'] 

def get_diff(df):
   first_val = df['confirmedInfections'][0] #Need to store the first row value since diff() method would otherwise render it as NaN
   df['confirmedInfections'] = df['confirmedInfections'].diff(1)
   df['confirmedInfections'][0] = first_val



df_list = [df_DE1, df_DE2]

for df in df_list:
    get_diff(df)

考虑到df被理解为:

df = pd.read_csv(file, header='infer', parse_dates=['date'])

根据需要更新“确认影响”栏,区别:

df["confirmedInfections"] = df.groupby('ID')['confirmedInfections'].diff().fillna(df.confirmedInfections).astype(int)

解释 按ID对df进行分组,并使用行之间的值差异更新行“confirmedInfections”列,然后使用原始值更新每个groupedID的NaN(第一行)。由于“confirminfections”的计算结果是float类型,因此将列类型转换为int。最后将df拆分为下面的多个df

在多个dfs中拆分df

for id in df.ID.unique():
    print('DataFrame', id)
    print(df.groupby('ID').get_group(id))

输出

DataFrame DE2
    ID    name        date  confirmedInfections
0  DE2  BAYERN  2020-02-24                   19
1  DE2  BAYERN  2020-02-25                    0
2  DE2  BAYERN  2020-02-26                    2
DataFrame DE1
    ID               name        date  confirmedInfections
3  DE1  BADEN-WÃRTTEMBERG  2020-02-24                    1
4  DE1  BADEN-WÃRTTEMBERG  2020-02-25                    2
5  DE1  BADEN-WÃRTTEMBERG  2020-02-26                    4

相关问题 更多 >

    热门问题