網站首頁 編程語言 正文
寫在前面
最近有朋友問我怎么把一個Excel工作表中的數據按照對應的匹配規則放到另外一個表中, 要求是兩個對應的列要相同, 具體來看就是sheet1中數據比較多, sheet2中只含有兩列, 這兩列包含了年份和行業信息, 這兩個表的header(pandas中的術語, 表示表頭或者列名)都是相同的, 所以關鍵點就是讓表1中的數據與表2中的數據建立對應即可, 然后注意一下選取過的數據就不能選了這個條件.
當然可能會有直接使用Pandas內置高級函數的方法來做, 但是畢竟不是主要研究數據分析了, 能用就行…
為了數據安全, 這里就不放截圖了.
主要思路
因為要填充表2, 那么當然要遍歷表二的每一行, 針對這每一行給出的列標信息, 然后遍歷表1中滿足條件的行, 填入表二之后break即可, 因為可能會出現重復遍歷, 這里用到了哈希表的方法, 并且哈希表也有兩種實現,
一種是給表1新添加一個列, 這個列可以是布爾值或者全0列, 表示沒有遍歷過(unused), 然后在滿足條件的行添加到表二之后, 將對應值設置為1即可, 這樣可以在之后的遍歷過程中忽略掉已添加的數據.
另一種方法就是使用哈希表存儲表一中遍歷過的行的索引, 思路跟上面是一樣的, 但是不會對原始數據進行增刪.
代碼
代碼部分我給出了兩個版本, 一種是我首先想到的, 不借助pandas內置函數, 將數據轉換為列表來完成, 這樣雖然好想當然之后還要手動處理表頭, 比較麻煩, 代碼如下:
import pandas as pd
df1 = pd.read_excel('data.xlsx', sheet_name='Sheet1', header=0).values.tolist()
df2 = pd.read_excel('data.xlsx', sheet_name='Sheet2', header=0).values.tolist()
for i in range(len(df1)):
? ? df1[i].append(0)
for i, item in enumerate(df2):
? ? for j in range(len(df1)):
? ? ? ? if df1[j][-1] == 0 and df1[j][0] == item[0] and df1[j][2] == item[2]:
? ? ? ? ? ? df2[i] = df1[j]
? ? ? ? ? ? df1[j][-1] = 1
? ? ? ? ? ? break
df2 = pd.DataFrame(df2)
print(df2)
with pd.ExcelWriter("data.xlsx", mode='a', engine='openpyxl') as writer:
? ? df2.to_excel(writer, sheet_name="Sheet3")
另一種用到了pandas內置的行遍歷方法和索引等方法, 對Dataframe這種pandas內置的原生數據結構支持比較好, 但是不用的話就總忘…
import pandas as pd
# pd.set_option('display.max_columns', None)
pd.set_option('display.max_rows', None)
df1 = pd.read_excel('data.xlsx', sheet_name='Sheet1', header=0)
df2 = pd.read_excel('data.xlsx', sheet_name='Sheet2', header=0)
# 標記是否匹配過
used = set()
for idx2, row2 in df2.iterrows():
? ? tmp = df1[(df1['所屬行業'] == row2['所屬行業']) & (df1['新年份'] == row2['新年份'])]
? ? for idx1, row1 in tmp.iterrows():
? ? ? ? if idx1 not in used:
? ? ? ? ? ? df2.iloc[idx2, :] = row1
? ? ? ? ? ? used.add(idx1)
? ? ? ? ? ? break
df2.set_index('所屬行業', inplace=True)
print(df2)
with pd.ExcelWriter("data.xlsx", mode='a', engine='openpyxl') as writer:
? ? df2.to_excel(writer, sheet_name="Sheet4")
原文鏈接:https://blog.csdn.net/qq_41437512/article/details/128468634
相關推薦
- 2023-05-16 Android?MessageQueue消息隊列主要作用詳解_Android
- 2022-04-10 C#實現計算器功能(winform版)_C#教程
- 2022-11-01 python一行輸入多值的實現詳解_python
- 2023-02-12 JetpackCompose?Navigation導航實現流程_Android
- 2022-11-22 在?React?項目中全量使用?Hooks的方法_React
- 2022-05-26 C++?棧和隊列的實現超詳細解析_C 語言
- 2022-09-24 深入理解C#委托delegate的使用_C#教程
- 2023-06-02 關于pip安裝opencv-python遇到的問題_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支