Python Pandas从一张纸复制列到另一张纸而不改变任何数据?
我有一个两张工作表的Excel文件。 我想从第一张表格复制3列到第二张表格。
注意:
- 复制的3列标签名称与第二张表格有一些重复。 但是我应该保留第二张纸的原始数据而不改变它们 。
-
我已经尝试了很多方法。 我迄今为止的最佳尝试是:
df_new_sheet2 = pd.concat([df_old_sheet2, df_three_of_sheet1], axis=1, join_axes=[df_old_sheet2.index])
但是这不是理想的输出。
如果pandas不能做到这一点,你可以请build议一些其他的Python包可以工作吗?
如果我没有足够清楚地描述问题,我会上传一张照片,这可能会有所帮助。 Thx为你的答案〜
UPDATE [2017年7月24日]:
我终于find我的错!
插入一个索引号的列,然后按照b2002的分辨率,事情会变好的。 🙂
这个方法使用pandas和xlsxwriter 。
安装(创build演示excel文件):
import pandas as pd df1 = pd.DataFrame({'1_A': [1,2,3,4], '1_B': [5,4,6,5], '1_C': [8,7,9,0], '1_D': [9,7,8,5], '1_E': [2,4,9,8]}) df2 = pd.DataFrame({'1_A': [5,4,1,3], '1_B': [55,2,3,4]}) setup_dict = {'Sheet_1': df1, 'Sheet_2': df2} with pd.ExcelWriter('excel_file.xlsx', engine='xlsxwriter') as writer: for ws_name, df_sheet in setup_dict.items(): df_sheet.to_excel(writer, sheet_name=ws_name)
(从这里开始阅读一个现有的Excel文件)
#Read your excel file, use "sheetname=None" to create a dictionary of #worksheet dataframes. (Note: future versions of pandas will use #"sheet_name" vs. "sheetname"). #Replace 'excel_file.xlsx' with the actual path to your file. ws_dict = pd.read_excel('excel_file.xlsx', sheetname=None) #Modify the Sheet_2 worksheet dataframe: #(or, create a new worksheet by assigning concatenated df to a new key, #such as ws_dict['Sheet_3'] = ...) ws_dict['Sheet_2'] = pd.concat([ws_dict['Sheet_2'][['1_A','1_B']], ws_dict['Sheet_1'][['1_A','1_B','1_C']]], axis=1) #Write the ws_dict back to disk as an excel file: #(replace 'excel_file.xlsx' with your desired file path.) with pd.ExcelWriter('excel_file.xlsx', engine='xlsxwriter') as writer: for ws_name, df_sheet in ws_dict.items(): df_sheet.to_excel(writer, sheet_name=ws_name)
其他方法可以用来组合列,例如连接(例如代表原始工作表的不同后缀),因为当读取excel文件时,所有工作表都转换为数据框。
编辑(为新的工作表和唯一的列名称…)
ws_dict = pd.read_excel('excel_file.xlsx', sheetname=None) #Modify the Sheet_2 worksheet dataframe: #(or, create a new worksheet by assigning concatenated df to a new key, #such as ws_dict['Sheet_3'] = ...) ws_dict['Sheet_3'] = ws_dict['Sheet_2'][['1_A','1_B']].join(ws_dict['Sheet_1'][['1_A','1_B','1_C']], lsuffix='_sh2', rsuffix='_sh1', how='outer') #Write the ws_dict back to disk as an excel file: #(replace 'excel_file.xlsx' with your desired file path.) with pd.ExcelWriter('excel_file.xlsx', engine='xlsxwriter') as writer: for ws_name, df_sheet in ws_dict.items(): df_sheet.to_excel(writer, sheet_name=ws_name)
如果在Windows中使用Excel和Python(如果没有的话,为了将来的读者),考虑一个SQL解决scheme,它带有一个到JET / ACE引擎的ODBC连接,可以查询Excel工作簿,自己的Access数据库甚至文本文件(csv / tab /文本)。 这个.dll文件引擎默认安装在Windows机器或MS Office上。 这种方法避免打开任何工作簿。
只需在表单上运行INNER JOIN
,然后使用panda的read_sql()
将查询结果集直接导入数据read_sql()
。 连接可以使用pyodbc
或pypyodbc
模块。 而且由于你在SQL中工作, SELECT
需要的列,重命名它们,使用WHERE
, JOIN
或UNION
等工作表进行筛选,并在其他工作簿中使用GROUP BY
聚合:
import pyodbc import pandas as pd strfile = "C:\Path\To\Workbook.xlsx" conn = pyodbc.connect(r'Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};' + \ 'DBQ={};'.format(strfile), autocommit=True) strSQL = " SELECT s1.[1_A] As s1_1_A, s1.[1_B] As s1_1_B," + \ " s2.[1_A] AS s2_1_A, s2.[1_B] As s2_1_B, s2.[1_C] As s2_1_C" + \ " FROM [Sheet1$] s1" + \ " INNER JOIN [Sheet2$] s2 ON s1.[index] = s2.[index]" df = pd.read_sql(strSQL, conn) conn.close()