当多个条件为真时,根据来自另一个 df 的行创建 df

时间:2021-07-21 14:06:06

标签: python pandas dataframe

当满足多个条件时,我正在尝试使用另一个创建一个新的 df。 如 - 我有一个包含压力和深度数据的 df,我想将其拆分为三个较小的 df。

a shallow one < 2900m 
the mid range > 2901m but <3500m
and deep >3501m 

我试过看起来像这样的鳕鱼:

mid =df[df.depth > 2958 & < 3530]

对于中间的,得到一个无效的语法。

如果只有一个条件我可以做到:

shallow = df[df.depth < 2900] 

它工作得很好,我只是不确定如何将多个条件放入

1 个答案:

答案 0 :(得分:0)

对于多个条件,您可以使用 & 逻辑将它们连接在一起。例如,您还应该使用 或等于 以便您的条件在 [2900, 2901] 之间没有间隙。

示例数据

import pandas as pd
import numpy as np

df = pd.DataFrame({'depth': np.linspace(2700, 3900, 13)})

代码

df[(df['depth'] >= 2900) & (df['depth'] < 3500)]
#    depth
#2  2900.0
#3  3000.0
#4  3100.0
#5  3200.0
#6  3300.0
#7  3400.0

#Equivalently with the `.lt`, `.gt`, `.le`, `.ge`, `.ne`, `.eq` operators
df[df['depth'].ge(2900) & df['depth'].lt(3500)]

如果要存储每个子 DataFrame,这需要您定义可变数量的变量。如果需要,您可以将 pd.cut 与 groupby 一起使用,而不是这样做,以将结果存储在 dict 中(或仅对 groupby 对象进行操作)。

d = dict(tuple(df.groupby(pd.cut(df['depth'], [-np.inf, 2900, 3500, np.inf], 
                                 right=False, labels=['shallow', 'mid', 'deep']))))

d['shallow']
#    depth
#0  2700.0
#1  2800.0

d['mid']
#    depth
#2  2900.0
#3  3000.0
#4  3100.0
#5  3200.0
#6  3300.0
#7  3400.0

d['deep']
#     depth
#8   3500.0
#9   3600.0
#10  3700.0
#11  3800.0
#12  3900.0