我有兩個(gè)相同的數(shù)據(jù)幀new
和old
。new
數(shù)據(jù)幀將在一天中隨機(jī)更新。下面的代碼檢查是否有任何更改。
import pandas as pd
import numpy as np
new = {'name': ['Sheldon', 'Penny', 'Amy', 'Bernadette', 'Raj', 'Howard'],
'episodes': [42, 24, 31, 29, 37, 40],
'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
old = {'name': ['Sheldon', 'Penny', 'Amy', 'Bernadette', 'Raj', 'Howard'],
'episodes': [12, 32, 31, 32, 37, 40],
'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
df1 = pd.DataFrame(new, columns = ['name','episodes', 'gender'])
df = pd.DataFrame(old, columns = ['name','episodes', 'gender'])
while True:
df1 = pd.DataFrame(new, columns = ['name','episodes', 'gender'])
print(df[~df.episodes.eq(df1.episodes)])
df1 = df
我需要在while
循環(huán)中寫入條件,其中df[~df.episodes.eq(df1.episodes)]
僅在檢測(cè)到更改時(shí)才打印。打印新數(shù)據(jù)后,它會(huì)將兩個(gè)數(shù)據(jù)框設(shè)置為相同的值(因?yàn)椴辉傩枰f數(shù)據(jù)),并重新檢查更改。上述代碼將打?。?/p>
Columns: [name, episodes, gender]
Index: []
Empty DataFrame
Columns: [name, episodes, gender]
Index: []
Empty DataFrame
Columns: [name, episodes, gender]
Index: []
Empty DataFrame
因此,如果實(shí)際打印了更改,則可能會(huì)遺漏。你能建議一種更有效的方法來完成這項(xiàng)工作嗎。
==編輯==
根據(jù)@BENY的回答,如果我這樣做:
import pandas as pd
import numpy as np
new = {'name': ['Sheldon', 'Penny', 'Amy', 'Bernadette', 'Raj', 'Sheldon'],
'episodes': [42, 24, 31, 29, 37, 40],
'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
old = {'name': ['Sheldon', 'Penny', 'Amy', 'Bernadette', 'Raj', 'Sheldon'],
'episodes': [12, 32, 31, 32, 37, 40],
'gender': ['male', 'female', 'female', 'female', 'male', 'male']}
df1 = pd.DataFrame(new, columns = ['name','episodes', 'gender'])
df = pd.DataFrame(old, columns = ['name','episodes', 'gender'])
while True:
df1 = pd.DataFrame(new, columns = ['name','episodes', 'gender'])
out = df.merge(df1[['name','episodes']],on=['name','episodes'],how='left',indicator=True).loc[lambda x : x['_merge']=='left_only']
print(out)
df = df1
它會(huì)在整個(gè)whileloop過程中打印出來:
name episodes gender _merge
0 Sheldon 12 male left_only
1 Penny 32 female left_only
3 Bernadette 32 female left_only
name episodes gender _merge
0 Sheldon 12 male left_only
1 Penny 32 female left_only
3 Bernadette 32 female left_only
name episodes gender _merge
0 Sheldon 12 male left_only
1 Penny 32 female left_only
3 Bernadette 32 female left_only
有沒有辦法只打印一次。直到有另一個(gè)變化。如果我df= df1
比它將打印如下,我將錯(cuò)過更改:
Columns: [name, episodes, gender, _merge]
Index: []
Empty DataFrame
Columns: [name, episodes, gender, _merge]
我需要在檢測(cè)到更改的地方干凈地獲取這些數(shù)據(jù)。
如果要比較2數(shù)據(jù)幀并檢查任何更改/差異,為什么不使用
DataFrame.compare()
函數(shù)?以下是基于示例數(shù)據(jù)的示例輸出:
Output:
默認(rèn)情況下,它僅突出顯示差異。這里,它顯示只有列
episodes
有差異。self
對(duì)應(yīng)于df
的值,other
對(duì)應(yīng)于df1
的值左邊的索引,即
0
、1
和3
顯示了不同的行索引。如果要顯示整個(gè)原始形狀,還可以使用
keep_shape=
參數(shù),如下所示:Output:
僅顯示不同的值。
NaN
值是沒有差異的值。當(dāng)然,如果愿意,也可以選擇顯示所有值,包括相等值,如下所示:
Output
此選項(xiàng)允許您并排比較以檢查差異。不管怎么說,要找出差異就不那么容易了。
我建議您首先使用默認(rèn)選項(xiàng)僅顯示差異(可能是寫下具有差異的行的索引),并且可以選擇僅在需要詳細(xì)檢查另一側(cè)值(相等)時(shí)使用其他2個(gè)選項(xiàng)。
要在
while
循環(huán)下使用,可以使用: