簡體   English   中英

將pandas字符串列拆分為一個數組並將該數組與另一個數組匹配

[英]Split pandas string column into an array and match that array to another array

我有一個看起來像這樣的Pandas數據框:

       var1    var2
0    A_B_C_D    123
1    E_F_G_H    456
2    I_J_K_L    789

我想通過在'_'上分割var1來查詢數據幀,然后將其匹配到我定義的另一個數組。 假設數組是array_to_match_to = ['A', 'B', 'C', 'D']那么我想過濾數據幀以僅獲取第0行。

另外,無論順序如何,我都想匹配,因此與['D','A','B','C']的匹配也返回第0行。

除了使用.iterrows遍歷df的所有行之外,是否有一種簡單有效的方法來做到這.iterrows

使用str.split

match = np.array(['A', 'B', 'C', 'D'])

df[(np.array(df.var1.str.split('_').values.tolist()) == match).all(1)]

      var1  var2
0  A_B_C_D   123

或使用np.core.defchararray.split

match = np.array(['A', 'B', 'C', 'D'])
splits = np.stack(np.core.defchararray.split(df.var1.values.astype(str), '_'))

df[(splits == match).all(1)]

      var1  var2
0  A_B_C_D   123

定時

%timeit df[(np.array(df.var1.str.split('_').values.tolist()) == match).all(1)]
%timeit df[(np.stack(np.core.defchararray.split(df.var1.values.astype(str), '_')) == match).all(1)]

1000 loops, best of 3: 399 µs per loop
1000 loops, best of 3: 266 µs per loop

可以使用pd.Series.str方法str.split拆分字符串:

df['var1'] = df['var1'].str.split('_')

對於與順序無關的匹配,事情比較棘手,如果僅像您的示例中那樣嘗試匹配一個外部列表,我可能首先要轉移焦點,方法str.join在array_to_match_to上使用str.join並找到匹配的值,而不是在數據框中拆分。

然后,要將其擴展到array_to_match_to的所有順序,可以顯式采用排列,如下所示

from itertools import permutations
df[df['var1'].isin(['_'.join(m) for m in permutations(array_to_match_to)])]

對於array_to_match_to = ['A', 'B','C', 'D']array_to_match_to = ['D', 'A', 'B','C']第零行都匹配。

您可以先拆分var1,對其進行排序,然后將其與匹配列表進行比較以獲取掩碼數組,然后使用它來選擇行。

df
Out[432]: 
      var1  var2
0  A_B_C_D   123
1  E_F_G_H   456
2  I_J_K_L   789
3  D_A_B_C   789

match= ['A', 'B', 'C', 'D']    
df[df.var1.str.split('_').apply(sorted).apply(lambda x np.array_equal(x,match))]

Out[430]: 
      var1  var2
0  A_B_C_D   123
3  D_A_B_C   789

暫無
暫無

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

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