Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将新数据合并到现有数据帧中_Python_Pandas_Dataframe - Fatal编程技术网

Python 将新数据合并到现有数据帧中

Python 将新数据合并到现有数据帧中,python,pandas,dataframe,Python,Pandas,Dataframe,用我的代码,我可以在一个数据库中加入两个数据库。现在,我需要对另一个数据库文件执行同样的操作 档案1: Fecha Cliente Impresiones Impresiones 2 Revenue 20/12/17 Jose 1312 35 $12 20/12/17 Martin 12 56 $146 20/12/17 Pedro 5

用我的代码,我可以在一个数据库中加入两个数据库。现在,我需要对另一个数据库文件执行同样的操作

档案1:

Fecha       Cliente     Impresiones Impresiones 2   Revenue
20/12/17    Jose        1312        35              $12
20/12/17    Martin      12          56              $146
20/12/17    Pedro       5443        124             $1,256
20/12/17    Esteban     667         1235            $1
档案2:

Fecha       Cliente     Impresiones Impresiones 2   Revenue
21/12/17    Jose        25          5               $2
21/12/17    Martin      6347        523             $123
21/12/17    Pedro       2368        898             $22
21/12/17    Esteban     235         99              $7,890
阿奇沃:

Fecha       Cliente     Impresiones Impresiones 2   Revenue
22/12/17    Peter       55          5               $2
22/12/17    Juan        634527      523             $123
22/12/17    Pedro       836         898             $22
22/12/17    Esteban     125         99              $7,890
我有以下结果:

问题是我需要将新数据库(
archivo
)添加到
Data.xlsx
文件中,它看起来如下所示:

代码:


扩展我的评论作为回答,我建议创建一个函数,该函数将重塑您的数据帧以符合给定的格式。我建议这样做,只是因为重塑数据比重塑新条目以符合现有结构要容易得多。这是因为您当前的结构是一种非常难以使用的格式(请接受我的建议)

因此,最简单的方法是创建一个函数-

def process(dfs):    
    df = pd.concat(dfs)\
           .set_index(['Cliente', 'Fecha'])\
           .stack()\
           .unstack(-2)\
           .sort_index(ascending=[True, False])

    i = df.index.get_level_values(0)
    j = df.index.get_level_values(1)

    y = np.insert(j.values, np.flatnonzero(j == 'Revenue'), i.unique())
    x = i.unique().repeat(len(df.index.levels[1]) + 1)

    df = df.reindex(pd.MultiIndex.from_arrays([x, y])).fillna('')
    df.index = df.index.droplevel()

    return df
现在,加载数据帧-

df_list = []
for file in ['archivo1.xlsx', 'archivo2.xlsx', ...]:
    df_list.append(pd.read_excel(file))
现在,使用
df\u列表调用
进程
函数
-

df = process(df_list)
df

Fecha        20/12/17 21/12/17
Esteban                       
Revenue            $1   $7,890
Impresiones2     1235       99
Impresiones       667      235
Jose                          
Revenue           $12       $2
Impresiones2       35        5
Impresiones      1312       25
Martin                        
Revenue          $146     $123
Impresiones2       56      523
Impresiones        12     6347
Pedro                         
Revenue        $1,256      $22
Impresiones2      124      898
Impresiones      5443     2368
df
保存到新的excel文件中。对进入系统的每个新数据帧重复该过程

总之,您的整个代码清单如下所示-

import pandas as pd
import pandas.io.formats.excel
import numpy as np


def process(dfs):    
    df = pd.concat(dfs)\
           .set_index(['Cliente', 'Fecha'])\
           .stack()\
           .unstack(-2)\
           .sort_index(ascending=[True, False])

    i = df.index.get_level_values(0)
    j = df.index.get_level_values(1)

    y = np.insert(j.values, np.flatnonzero(j == 'Revenue'), i.unique())
    x = i.unique().repeat(len(df.index.levels[1]) + 1)

    df = df.reindex(pd.MultiIndex.from_arrays([x, y])).fillna('')
    df.index = df.index.droplevel()

    return df


if __name__ == '__main__':
    df_list = []
    for file in ['archivo1.xlsx', 'archivo2.xlsx']:
        df_list.append(pd.read_excel(file))

    df = process(df_list)


    with pd.ExcelWriter("test.xlsx",
                        engine='xlsxwriter',
                        date_format='dd/mm/yyyy',
                        datetime_format='dd/mm/yyyy') as writer:                
        df.to_excel(writer, sheet_name='Sheet1') 


这个繁琐过程的替代方案是更改数据集结构,并重新考虑一个更可行的替代方案,该方案使向现有数据中添加新数据变得更容易,而不必从头开始重新调整所有内容。这是你必须坐下来思考的事情。

简单地说,这是很难做到的。最后两个问题是关于如何将数据转换成一种非常难以处理的格式。不幸的是,您现在已经扩展了需求,以适应新数据的到来。我的建议是:咬紧牙关。重新运行代码。从头开始。而不是
pd.concat([df1,df2])执行
pd.concat([df1,df2,df3])
。这是我能给你的最好的建议。好的,你知道另一种做类似事情的方法吗?我指的是一个数据库,实际上我整天都在用它来生成excel文件@Cᴏʟᴅsᴘᴇᴇᴅ如果您不介意重新创建输出,请查看我的答案。请查看我的编辑,我已添加了您的整个代码列表所需的外观。如果答案有用,您可以将其标记为已接受?我只能在您的代码中看到客户的姓名@MartinBouhier抱歉,我做了一些编辑。你能再运行一次吗?我的错误和以前一样。你能看到正确的结果吗?@MartinBouhier我交换了
x
y
的定义。:-)现在可以了,测试过了,没问题!很抱歉谢谢
import pandas as pd
import pandas.io.formats.excel
import numpy as np


def process(dfs):    
    df = pd.concat(dfs)\
           .set_index(['Cliente', 'Fecha'])\
           .stack()\
           .unstack(-2)\
           .sort_index(ascending=[True, False])

    i = df.index.get_level_values(0)
    j = df.index.get_level_values(1)

    y = np.insert(j.values, np.flatnonzero(j == 'Revenue'), i.unique())
    x = i.unique().repeat(len(df.index.levels[1]) + 1)

    df = df.reindex(pd.MultiIndex.from_arrays([x, y])).fillna('')
    df.index = df.index.droplevel()

    return df


if __name__ == '__main__':
    df_list = []
    for file in ['archivo1.xlsx', 'archivo2.xlsx']:
        df_list.append(pd.read_excel(file))

    df = process(df_list)


    with pd.ExcelWriter("test.xlsx",
                        engine='xlsxwriter',
                        date_format='dd/mm/yyyy',
                        datetime_format='dd/mm/yyyy') as writer:                
        df.to_excel(writer, sheet_name='Sheet1')