簡體   English   中英

根據另一個數據幀的多個列過濾數據幀

[英]Filter dataframe based on multiple columns of another dataframe

我有這樣的數據幀:

    ID1    ID2
0   foo    bar
1   fizz   buzz

而另一個像這樣:

    ID1    ID2    Count    Code   
0   abc    def      1        A
1   fizz   buzz     5        A
2   fizz1  buzz2    3        C
3   foo    bar      6        Z
4   foo    bar      6        Z

我想要做的是過濾第二個數據幀,其中ID1和ID2匹配第一個數據幀中的一行,每當匹配時我想從第一個數據幀中刪除該行以避免重復。 這將產生一個如下所示的數據框:

    ID1    ID2    Count    Code   
1   fizz   buzz     5        A
3   foo    bar      6        Z

我知道我可以通過嵌套for循環,逐步遍歷所有行,並在我得到匹配時從第一幀手動刪除一行但我想知道是否有更多的pythonic方法來做到這一點。 我沒有大熊貓的經驗,所以可能有一個更清潔的方法,我不知道。 我之前使用的是.isin()但不得不廢棄它。 每個ID對最多可以存在於數據幀中N次,我需要過濾后的幀包含一對0到N個實例。

使用與drop_duplicates merge ,如果只有相同的列用於連接兩個df

df = pd.merge(df1,df2.drop_duplicates())
print (df)
    ID1   ID2  Count Code
0   foo   bar      6    Z
1  fizz  buzz      5    A

如果只需要在ID列中檢查dupe:

df = pd.merge(df1,df2.drop_duplicates(subset=['ID1','ID2']))
print (df)
    ID1   ID2  Count Code
0   foo   bar      6    Z
1  fizz  buzz      5    A

如果更多的列overlaping添加參數on

df = pd.merge(df1, df2.drop_duplicates(), on=['ID1','ID2'])

如果沒有刪除欺騙行:

df = pd.merge(df1,df2)
print (df)
    ID1   ID2  Count Code
0   foo   bar      6    Z
1   foo   bar      6    Z
2  fizz  buzz      5    A

嘗試這個:

df2.merge(df1[['ID1','ID2']])

或者試試這個?

df.loc[(df.ID1.isin(df1.ID1))&(df.ID2.isin(df1.ID2)),:].drop_duplicates()


Out[224]: 
    ID1   ID2  Count Code
1  fizz  buzz      5    A
3   foo   bar      6    Z

在元組列表中使用isin

df2[
    pd.Series(
        list(zip(df2.ID1.values, df2.ID2.values))
    ).isin(list(zip(df1.ID1.values, df1.ID2.values)))
]

    ID1   ID2  Count Code
1  fizz  buzz      5    A
3   foo   bar      6    Z
4   foo   bar      6    Z

合並幾乎是我想要的,但是沒有完成這項工作,因為我有一套奇怪的要求,我需要過濾掉一些重復項,但不是所有重復項。 常規合並不起作用,因為它保留所有重復項並且drop_duplicates()不起作用,因為我需要允許一些重復項。 我最終使用我在問題中描述的方法並嵌套for循環。

temp_frame = pd.DataFrame(columns.df2.columns)
for i in xrange(len(df2)):
    for ii in xrange(len(df1)):
        if df2['ID1'].iloc[i] == df1['ID1'].iloc[ii] and df2['ID2'].iloc[i] == df1['ID2'].iloc[ii]:
            df1.drop(df1.index[ii], inplace=True)
            temp_frame = temp_frame.append(df2.iloc[i], ignore_index=True)
            break
df1 = temp_frame.copy()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM