簡體   English   中英

與 Dataframe 列(多於一列)的列表比較列表

[英]List of list comparison with Dataframe columns (more than one column)

我有一個列表,如:

l=[['A,B,C,D', 'Z', 'category1'],
 ['A,B,C', 'Z', 'category2'],
 ['E,F,G,H', 'T', 'category4'],
 ['A,E,H', 'T', 'category4']]

和一個 DataFrame 像:

Col1       Col2       Col3
A          Z          category1
A,B,C,D    Z          category1
E,F,G,H,I  T          category4
A,E,H      T          category4 
A,E,H      T          category5
A,E,H      U          category4   

所以我想將列表列表與數據框列進行比較(考慮所有 3 列)。 與循環的比較工作效率不高,有沒有辦法進行比較並僅從數據框中返回匹配的行?

Desired Output DataFrame:

Col1       Col2       Col3
A,B,C,D    Z          category1
A,E,H      T          category4 

謝謝!!

如果您尋找所有 3 列的完全匹配,為什么不嘗試將三列連接到第四列:

df['col4']=df['col1']+df['col2']+df['col3']

返回:

        col1 col2       col3                 col4
0          A    Z  category1          AZcategory1
1    A,B,C,D    Z  category1    A,B,C,DZcategory1
2  E,F,G,H,I    T  category4  E,F,G,H,ITcategory4
3      A,E,H    T  category4      A,E,HTcategory4
4      A,E,H    T  category5      A,E,HTcategory5
5      A,E,H    U  category4      A,E,HUcategory4

您可以將 'col4' 與列表list_join的連接字符串進行list_join

list_join=[''.join(item) for item in l]

看起來像:

['A,B,C,DZcategory1', 'A,B,CZcategory2', 'E,F,G,HTcategory4', 'A,E,HTcategory4']

然后根據共同值進行合並:

common =df[df['col4'].isin(list_join)]

優點是您只需在單個列中搜索而不是在所有三列中進行搜索,這極大地簡化了您的功能。 缺點是靈活性較低。

創建DataFrame從列表中,然后使用DataFrame.merge默認內部聯接,如果沒有參數on它通過合並兩列的所有DataFrame S:

l=[['A,B,C,D', 'Z', 'category1'],
 ['A,B,C', 'Z', 'category2'],
 ['E,F,G,H', 'T', 'category4'],
 ['A,E,H', 'T', 'category4']]

df = pd.DataFrame(l, columns=['Col1','Col2','Col3']).merge(df)
print (df)
      Col1 Col2       Col3
0  A,B,C,D    Z  category1
1    A,E,H    T  category4

一種方法是使用pandas.Series.duplicated方法:

#df = <your DataFrame defined here>

l=[['A,B,C,D', 'Z', 'category1'],
 ['A,B,C', 'Z', 'category2'],
 ['E,F,G,H', 'T', 'category4'],
 ['A,E,H', 'T', 'category4']]

listdf=pd.DataFrame(data = l, columns=df.columns)   #transform list to dataframe
df=df.append(listdf)  #append your list to the main dataframe

duplicates=df.duplicated() # find duplicate rows; returns series of booleans

print(df[duplicates]) # print duplicate rows

輸出:

#      Col1 Col2       Col3
#0  A,B,C,D    Z  category1
#3    A,E,H    T  category4

暫無
暫無

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

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