[英]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.