Python 将新数据合并到现有数据帧中
用我的代码,我可以在一个数据库中加入两个数据库。现在,我需要对另一个数据库文件执行同样的操作 档案1: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
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')