将新数据合并到现有数据框

时间:2017-12-26 17:56:22

标签: python pandas dataframe

使用我的代码,我可以将2个数据库合二为一。现在,我需要对另一个数据库文件做同样的事情。

archivo1:

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

archivo2:

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

我有这样的结果:

enter image description here

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

enter image description here

代码:

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

# Leemos ambos archivos y los cargamos en DataFrames
df1 = pd.read_excel("archivo1.xlsx")
df2 = pd.read_excel("archivo2.xlsx")

df = pd.concat([df1, df2])\
       .set_index(['Cliente', 'Fecha'])\
       .stack()\
       .unstack(-2)\
       .sort_index(ascending=[True, False])

i, j = df.index.get_level_values(0), df.index.get_level_values(1)
k = np.insert(j.values, np.flatnonzero(j == 'Revenue'), i.unique())

idx = pd.MultiIndex.from_arrays([i.unique().repeat(len(df.index.levels[1]) + 1), k])
df = df.reindex(idx).fillna('')
df.index = df.index.droplevel()

# Creamos el xlsx de salida
pandas.io.formats.excel.header_style = None

with pd.ExcelWriter("Data.xlsx",
                    engine='xlsxwriter',
                    date_format='dd/mm/yyyy',
                    datetime_format='dd/mm/yyyy') as writer:

    df.to_excel(writer, sheet_name='Sheet1')

1 个答案:

答案 0 :(得分:3)

扩展我的评论作为答案,我建议创建一个能够重塑数据帧以符合给定格式的函数。我建议这样做只是因为重新整形数据要容易得多,而不是重新整形新条目以符合现有结构。这是因为您当前的结构是一种格式,使其非常难以使用(从我这里拿走)。

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

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))

现在,使用process -

调用df_list函数
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') 

这个繁琐过程的替代方法是更改​​数据集结构,并重新考虑一个更可行的替代方案,这样可以更轻松地将新数据添加到现有数据,而无需从头开始重塑所有内容。这是你必须坐下来思考的事情。