首先,我知道過去有人問過類似的問題,但沒有一個適用于我的用例,我對 Pandas 的了解不足以讓我自己去那里。所以,我有 2 個電子表格 (xlsx),我們稱它們為檔案 1 和檔案 2
檔案1:
| ID | 知識產權 | 姓名 | 注釋 | 作業系統 | 標題 | 地位 |
|---|---|---|---|---|---|---|
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 積極的 | |
| 2 | 127.0.0.1 |
別的東西 | 視窗 3.11 | 標題 1 | 固定的 | |
| 3 | 127.0.0.1 |
新的一個 | 視窗 3.11 | 標題 1 | 固定的 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 積極的 |
檔案2:
| ID | 知識產權 | 姓名 | 注釋 | 作業系統 | 標題 | 地位 |
|---|---|---|---|---|---|---|
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 固定的 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 固定的 | |
| 5 | 127.0.0.1 |
哦哦 | 視窗 3.11 | 標題 1 | 積極的 |
我在 Python 中將這 2 個檔案與 Pandas 合并:
df1 = pd.read_excel('file1.xlsx')
df2 = pd.read_excel('file2.xlsx')
#I just need a column with the file name, hence these variables
file1 = "file1.xlsx"
file2 = "file2.xlsx"
df1 = df1.sort_values('ID')
#Adds a new column with the file name
df1["File"] = file1
df2 = df2.sort_values('ID')
#Adds a new column with the file name
df2["File"] = file2
dfs = [df1, df2]
#Black magic to merge the 2 files into 1
df_diff = pd.concat(dfs).drop_duplicates(keep=False, subset=['IP', 'Name', 'Comments', 'ID', 'Title', 'Status'])
df_diff = df_diff.drop(df_diff[])
df_diff.to_excel(r'file3.xlsx')
這是生成的檔案:
| ID | 知識產權 | 姓名 | 注釋 | 作業系統 | 標題 | 地位 | 檔案 |
|---|---|---|---|---|---|---|---|
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 1 | |
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 2 | |
| 2 | 127.0.0.1 |
別的東西 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 1 | |
| 3 | 127.0.0.1 |
新的一個 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 1 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 1 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 2 | |
| 5 | 127.0.0.1 |
哦哦 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 2 |
如您所見,在新檔案中有一個新列,指示該行來自哪個檔案(行檔案)。現在,我希望 Pandas 檢查以下情況:
僅存在于檔案 1 中的任何行,狀態設定為固定。
我想從檔案 3 中洗掉與上述條件匹配的任何行,以便最終得到下表:
| ID | 知識產權 | 姓名 | 注釋 | 作業系統 | 標題 | 地位 | 檔案 |
|---|---|---|---|---|---|---|---|
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 1 | |
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 2 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 1 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 2 | |
| 5 | 127.0.0.1 |
哦哦 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 2 |
我怎么能做到這一點?作為附錄,我還希望滿足以下條件:
兩個檔案中都存在任何行,唯一的區別是檔案 1 中的狀態是活動的,而檔案 2 中的狀態是固定的
uj5u.com熱心網友回復:
第一個條件實際上非常簡單,但有點不直觀。基于多個標準進行選擇的作業方式與使用單個標準幾乎相同,但您只需添加一個二進制 & 并將每個標準放在括號之間:
df[ (df['File'] == 'File 1') & (df['Status'] == 'Fixed') ]
它必須是“&”而不是“and”。可以通過類似的方式滿足第二個條件:
IDs_file1_active = df[ (df['File'] == 'File 1') & (df['Status'] == 'Active') ]['ID']
從檔案 1 中選擇每個 Active 條目的 ID。現在您可以從原始表中選擇帶有 ID 的行:
file1_active = df[ df['ID'].isin(IDs_file1_active) ]
并應用第二個條件:
file1_active [ (file1_active ['File'] == 'File 2') & (file1_active ['Status'] == 'Fixed') ]
這應該做你要問的。
uj5u.com熱心網友回復:
使用條件進行選擇。排除使用波浪號
cond=(df['File']=='File 1') & (df['Status'] =='Fixed')
df[~cond]
uj5u.com熱心網友回復:
假設您的最后一個資料集是 call de df
所以,你可以試試下面的代碼
mask = (df["File"]=="File 1") & (df["Status"]=="Fixed")
df = df[~mask]
df
| ID | 知識產權 | 姓名 | 注釋 | 作業系統 | 標題 | 地位 | 檔案 |
|---|---|---|---|---|---|---|---|
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 1 | |
| 1 | 127.0.0.1 |
某物 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 2 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 1 | |
| 4 | 127.0.0.1 |
還有一個 | 視窗 3.11 | 標題 1 | 固定的 | 檔案 2 | |
| 5 | 127.0.0.1 |
哦哦 | 視窗 3.11 | 標題 1 | 積極的 | 檔案 2 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/341090.html
