我有 2 個長度不等的資料幀。有些記錄可以同時存在于兩者中,有些記錄可能只存在于 1 個資料幀中。
data = [['1001', 4573, 'Test1'], ['1002', 4574, 'Test2'], ['1003', 4575, 'Test3']]
df1 = pd.DataFrame(data, columns = ['id', 'addressid','address'])
data = [['1001', 4573, 'Test1'], ['1002', 4574, 'Test22']]
df2 = pd.DataFrame(data, columns = ['id', 'addressid','address'])
我需要一種最佳方法來獲取差異列名稱。即,這里 id 1002 的地址從 Address2 更改為 Address22,因此我需要將列名作為輸出回傳。
預期輸出:[地址]
uj5u.com熱心網友回復:
如果將該id列設定為兩個資料幀的索引,則可以比較值(如合并):
# set id as index
df1 = df1.set_index('id')
df2 = df2.set_index('id')
# find inner join of index and columns
rows = df1.index.intersection(df2.index)
cols = df1.columns.intersection(df2.columns)
# get columns where at least one value is different
out = df2.loc[rows, cols].ne(df1.loc[rows, cols]).any() \
.loc[lambda x: x].index.tolist()
print(out)
# Output
['address']
uj5u.com熱心網友回復:
這是一個不特定于列名稱的通用方法,假設多個列可能已更改,并且多個記錄可能已更改:
請注意,我將“id”設定為索引,以便我有一些身份基礎來比較預期為同一物體的記錄。
這不僅列印為單個記錄更改的單個列名稱,而且會生成一個包含所有已更改記錄的資料框/表,并顯示更改的列名稱(或名稱串列)。
data = [['1001', 4573, 'Test1'], ['1002', 4574, 'Test2'], ['1003', 4575, 'Test3']]
df1 = pd.DataFrame(data, columns = ['id', 'addressid','address'])
data = [['1001', 4573, 'Test1'], ['1002', 4574, 'Test22']]
df2 = pd.DataFrame(data, columns = ['id', 'addressid','address'])
def getColChangedName(row):
colsChanged = []
for c in df1.columns.values:
if row[c "_diff"] == True:
colsChanged.append(c)
return ", ".join(colsChanged)
df1 = df1.set_index("id")
df2 = df2.set_index("id")
diffs = df1.merge(df2, left_index=True, right_index=True, suffixes=('_old', '_new'))
diff_cols = [c "_diff" for c in df1.columns.values]
for c in df1.columns.values:
diffs[c "_diff"] = diffs[c "_old"] != diffs[c "_new"]
diffs["Record_Changed"] = diffs[diff_cols].sum(axis=1)/len(diff_cols) > 0
diffs = diffs[diffs["Record_Changed"] == 1]
diffs["Cols_Changed"] = diffs.apply(lambda row: getColChangedName(row), axis=1)
diffs.head()
在測驗資料上,生成的 diffs DataFrame 如下所示:

而且,更簡單地說,如果您只想更改每條記錄的列串列:
print(diffs[["Cols_Changed"]])
Cols_Changed
id
1002 address
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/402326.html
標籤:
