![](/img/trans.png)
[英]Finding the index of rows based on a sequence of values in a column of pandas DataFrame
[英]Finding rows with same column values in pandas dataframe
我有兩個具有不同列大小的數據框,其中四個列在兩個數據框中可以具有相同的值。 我想在df1中創建一個新列,如果df2中有一行與df1中的行具有相同值的列'A','B','C'和'D',則該列的值為1 。 如果沒有這樣的行,我希望該值為0。行“ E”和“ F”對於檢查值並不重要。
是否有一個熊貓函數可以做到這一點,或者我必須在循環中做到這一點。
例如:
df1 =
A B C D E F
1 1 20 20 3 2
1 1 12 14 1 3
2 1 13 43 4 3
2 2 12 34 1 4
df2 =
A B C D E
1 3 12 14 2
1 1 20 20 4
2 2 21 31 5
2 2 12 34 8
預期輸出:
df1 =
A B C D E F Target
1 1 20 20 3 2 1
1 1 12 14 1 3 0
2 1 13 43 4 3 0
2 2 12 34 1 4 1
這很簡單。 如果檢查兩個DataFrame是否相等,則檢查每個元素是否等於各自的元素。
col_list = ['A', 'B', 'C', 'D']
idx = (df1.loc[:, col_list] == df2.loc[:, col_list]).all(axis=1)
df1['new_row'] = idx.astype(int)
我認為您需要merge
left join
和參數indicator=True
,然后將_merge
列與eq
(與==
相同)進行比較,最后通過astype
將布爾值True
和False
轉換為1
和0
:
cols = list('ABCD')
df1['Target'] = pd.merge(df1[cols],
df2[cols], how='left', indicator=True)['_merge'].eq('both').astype(int)
print (df1)
A B C D E F Target
0 1 1 20 20 3 2 1
1 1 1 12 14 1 3 0
2 2 1 13 43 4 3 0
3 2 2 12 34 1 4 1
詳情:
print (pd.merge(df1[cols], df2[cols], how='left', indicator=True))
A B C D _merge
0 1 1 20 20 both
1 1 1 12 14 left_only
2 2 1 13 43 left_only
3 2 2 12 34 both
您可以為此使用邏輯運算符。 您可以看一下在Pandas中用於布爾索引的Logic運算符, 或在Pandas中用於Element-wise邏輯或的 邏輯運算符 。
但是您的規范不足以提供解決方案草圖,因為我不知道df1中的行應如何與df2一起使用。 是行數是否相同,並且df1中的每一行都應具有同一行中A,B,C和D的df2中具有布爾值的列?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.