[英]How can I avoid for-loops using pandas?
如果可能的話,很想知道如何在不使用 for 循環的情況下優化此代碼。 我要做的是對 df['Состояние'] 系列中的所有值進行分類,逐一查看列表 list_rep 和 list_dem 中的關鍵詞。 謝謝!
conditions = ['a','b']
list_rep = ['a1','a2']
list_dem = ['b1','b2']
for i in list_rep:
df['Состояние'] = [conditions[0] if i in str(x).lower() else x for x in df['Состояние']]
for i in list_exp:
df['Состояние'] = [conditions[1] if i in str(x).lower() else x for x in df['Состояние']]
for i in conditions:
df['Состояние'] = [i if i in str(x).lower() else x for x in df['Состояние']]
df['Состояние'] = [x if x in conditions else '-' for x in df['Состояние']]
首先使用Series.str.lower
,然后使用Series.str.contains
和join
by |
對於正則表達式OR
並在numpy.select
中設置新值,然后使用Series.str.extract
並替換缺失值:
df = pd.DataFrame({'Состояние':['abc','def','opa1','ujb2','a1sb1d','B21op']})
print (df)
Состояние
0 abc
1 def
2 opa1
3 ujb2
4 a1sb1d
5 B21op
conditions = ['a','b']
list_rep = ['a1','a2']
list_dem = ['b1','b2']
s = df['Состояние'].str.lower()
m1 = s.str.contains('|'.join(list_rep))
m2 = s.str.contains('|'.join(list_dem))
df['Состояние'] = np.select([m1, m2], [conditions[0], conditions[1]], s)
df['Состояние'] = df['Состояние'].str.extract(f'({"|".join(conditions)})').fillna('-')
print (df)
Состояние
0 a
1 -
2 a
3 b
4 a
5 b
另一個想法是為映射創建字典,首先使用Series.str.lower
和Series.str.extract
,然后使用Series.map
並最后替換缺失值:
conditions = ['a','b']
list_rep = ['a1','a2']
list_dem = ['b1','b2']
d = {**dict.fromkeys(list_rep,conditions[0]),
**dict.fromkeys(list_dem,conditions[1]),
**dict(zip(conditions,conditions))}
print (d)
{'a1': 'a', 'a2': 'a', 'b1': 'b', 'b2': 'b', 'a': 'a', 'b': 'b'}
pat = rf'({"|".join(d.keys())})'
df['Состояние'] = (df['Состояние'].str.lower()
.str.extract(pat, expand=False)
.map(d)
.fillna('-'))
print (df)
Состояние
0 a
1 -
2 a
3 b
4 a
5 b
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.