鱼C论坛

 找回密码
 立即注册
查看: 5211|回复: 19

[已解决]python处理excel 表格,把一张表的数据复制到另外一张表里面

[复制链接]
发表于 2021-4-13 19:06:13 | 显示全部楼层 |阅读模式
60鱼币
如图,打开了2个表格,表一和表二,需要把表一的前5列和表二的前五列对比,内容一样的话把后面的复制到表二里面
表一里面的前五列内容一定包含在表二里面
表一和表二的行数不固定
最佳答案
2021-4-13 19:06:14
python鱼new 发表于 2021-4-14 13:18
复制过去就好了,表二里面后面的列没有内容的

那你用 pd.merge() 试试吧,两张表做关联,外连接,最后过滤出自己需要的,即可。
1.png

最佳答案

查看完整内容

那你用 pd.merge() 试试吧,两张表做关联,外连接,最后过滤出自己需要的,即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-13 19:06:14 | 显示全部楼层    本楼为最佳答案   
python鱼new 发表于 2021-4-14 13:18
复制过去就好了,表二里面后面的列没有内容的

那你用 pd.merge() 试试吧,两张表做关联,外连接,最后过滤出自己需要的,即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-13 19:07:05 | 显示全部楼层
@阿奇_o
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-13 20:31:29 | 显示全部楼层
哪位大佬帮忙看看,加我qq:595928473  发个10元小红包感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-14 00:39:19 | 显示全部楼层
大致懂你意思了,这用python很好做啊

提供下思路给你:
1.读取第一个表格  将前五列合作一起做个标签 用列表存起来 叫做Key列表。 将行数对应的后N行 存起来 叫做Data列表。
2.若标签空值时,停止添加数据。

3,读取第二个表格 将第一行前五列读出, 根据该标签 用index()函数找到坐标 ,然后拷贝Data数据到表二

会使用到 xlwt xlrd 两个库函数

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-14 10:41:18 | 显示全部楼层
……“把表一的前5列和表二的前五列对比,内容一样的话把后面的复制到表二里面”

相同的,复制过去,然后呢?覆盖掉 表2里数据?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-14 13:18:35 | 显示全部楼层
阿奇_o 发表于 2021-4-14 10:41
……“把表一的前5列和表二的前五列对比,内容一样的话把后面的复制到表二里面”

相同的,复制过去,然 ...

复制过去就好了,表二里面后面的列没有内容的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-14 13:41:00 | 显示全部楼层
591821661 发表于 2021-4-14 00:39
大致懂你意思了,这用python很好做啊

提供下思路给你:

谢谢回答, 我思路也是前五列作key,后面做值,具体怎么搞就不会了,刚学py没多久
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-14 15:49:24 | 显示全部楼层
不知道我理解的对不对,下边1和2 是原始数据,把前5列设置成了key
然后两个表格join。
输出是3
import pandas as pd

path = r'test.xlsx'

df1 = pd.read_excel(path,sheet_name=0,)
# print(df1)
df2 = pd.read_excel(path,sheet_name=1,)
# print(df2)


res=df1.join(df2.set_index(['Q', 'W', 'E', 'R', 'T']),on=['Q', 'W', 'E', 'R', 'T'])
print(res)
res.to_excel(r'test1.xlsx')
1.jpg
2.jpg
3.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-14 17:37:47 | 显示全部楼层
本帖最后由 python鱼new 于 2021-4-14 17:48 编辑



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-14 17:47:33 | 显示全部楼层
rsj0315 发表于 2021-4-14 15:49
不知道我理解的对不对,下边1和2 是原始数据,把前5列设置成了key
然后两个表格join。
输出是3

1.png
结果应该是这样的,你的2.jpg 里面的前5列不会有重复的,最后输出结果保持原来行的顺序
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-14 19:08:20 | 显示全部楼层
rsj0315 发表于 2021-4-14 15:49
不知道我理解的对不对,下边1和2 是原始数据,把前5列设置成了key
然后两个表格join。
输出是3

1.png 2.png 是处理之前,3.png是结果,    2   3 的行顺序没有改变

处理前

处理前

处理前

处理前

处理后结果

处理后结果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-14 19:09:14 | 显示全部楼层
python鱼new 发表于 2021-4-14 19:08
1.png 2.png 是处理之前,3.png是结果,    2   3 的行顺序没有改变

F需求量  这一列不用管
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-15 09:19:57 | 显示全部楼层
阿奇_o 发表于 2021-4-14 21:56
那你用 pd.merge() 试试吧,两张表做关联,外连接,最后过滤出自己需要的,即可。

谢谢,我研究看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-15 10:15:06 | 显示全部楼层
那就用楼上说的merge
import pandas as pd

path = r'test.xlsx'

df1 = pd.read_excel(path,sheet_name=0,)
# print(df1)
df2 = pd.read_excel(path,sheet_name=1,)
# print(df2)

res = pd.merge(df2,df1,
               on=['Q', 'W', 'E', 'R', 'T'],
               how='left',)
               # validate='M:1')
print(res)


res.to_excel(r'test1.xlsx')

搜狗截图20210415101440.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-15 10:19:24 | 显示全部楼层
用pandas重写写入表格后,格式就没有了,还得重新用openpyxl设置一下,具体看需求吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-15 10:29:25 | 显示全部楼层
本帖最后由 python鱼new 于 2021-4-15 10:33 编辑

33.png
阿奇_o 发表于 2021-4-14 21:56
那你用 pd.merge() 试试吧,两张表做关联,外连接,最后过滤出自己需要的,即可。


你好,重复的列都显示了,自己加了个_x  _y,我只想显示_x或_y要怎么设置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-15 22:51:11 | 显示全部楼层
本帖最后由 阿奇_o 于 2021-4-15 22:57 编辑
python鱼new 发表于 2021-4-15 10:29
你好,重复的列都显示了,自己加了个_x  _y,我只想显示_x或_y要怎么设置


按列名不好选,那就用 df.columns,类型虽然是DF的Index对象,
实际上就相当于一个列表,列表就可以随便切,各种切。。
或 直接用 df.iloc[ : , 2:-1]  # 从第3列 切到 倒数第二列

比如,你 result = pd.merge(left, right, how='left', ...) 外连接后,
那么,前一半的列 就是 left的所有列名(默认带_x),后一半的列 就是right的 ,
于是,“只显示_x的”,就可以这样:  
result[result.columns[:2]]  #假设左右表各有两列,并以各自的index关联


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-4-16 09:51:31 | 显示全部楼层
阿奇_o 发表于 2021-4-15 22:51
按列名不好选,那就用 df.columns,类型虽然是DF的Index对象,
实际上就相当于一个列表,列表就可以随 ...

好的,谢谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-4-17 12:36:26 | 显示全部楼层
是的是的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 02:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表