[英]Fastest way to filter results from one dataframe into another dataframe based on multiple conditions (including date range)
[英]Filter dataframe with multiple conditions including OR
我寫了一個小腳本,循環通過約束來過濾 dataframe。示例和后續解釋問題如下。
constraints = [['stand','==','L'],['zone','<','20']]
for x in constraints:
vari = x[2]
df = df.query("{0} {1} @vari".format(x[0],x[1]))
區 | 站立 | 速度 | 類型 | |
---|---|---|---|---|
0 | 2個 | 大號 | 83.7 | CH |
1個 | 7 | 大號 | 95.9 | 國際單位制 |
2個 | 14 | 大號 | 94.9 | FS |
3個 | 11 | 大號 | 93.3 | FS |
4個 | 13 | 大號 | 86.9 | CH |
5個 | 7 | 大號 | 96.4 | 國際單位制 |
6個 | 13 | 大號 | 82.6 | SL |
當有 OR 條件時,我想不出一種過濾方法。 例如,在上表中,我想使用代碼示例中的約束以及類型列中包含 SI 或 CH 的任何行返回 dataframe。 有沒有人對如何實現這一點有想法? 任何幫助將不勝感激。
這似乎已經完成了工作,但可能還有更好的方法。
for x in constraints:
vari = x[2]
if isinstance(vari,list):
frame = frame[frame[x[0]].isin(vari)]
else:
frame = frame.query("{0} {1} @vari".format(x[0],x[1]))
IIUC(在評論中查看我的問題)你可以這樣做:
做了一些不同的 df 來向你展示結果(我猜你展示的表格已經被過濾了)
df = pd.DataFrame(
{'zone': {0: 2, 1: 11, 2: 25, 3: 11, 4: 23, 5: 7, 6: 13},
'stand': {0: 'L', 1: 'L', 2: 'L', 3: 'C', 4: 'L', 5: 'K', 6: 'L'},
'speed': {0: 83.7, 1: 95.9, 2: 94.9, 3: 93.3, 4: 86.9, 5: 96.4, 6: 82.6},
'type': {0: 'CH', 1: 'SI', 2: 'FS', 3: 'FS', 4: 'CH', 5: 'SI', 6: 'SL'}})
print(df)
zone stand speed type
0 2 L 83.7 CH
1 11 L 95.9 SI
2 25 L 94.9 FS
3 11 C 93.3 FS
4 23 L 86.9 CH
5 7 K 96.4 SI
6 13 L 82.6 SL
res = df.loc[ ( (df['type']=='SI') | (df['type']=='CH') ) & ( (df['zone']<20) & (df['stand']=='L') ) ]
print(res)
zone stand speed type
0 2 L 83.7 CH
1 11 L 95.9 SI
讓我知道這是否是您要尋找的東西。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.