按其他pandas df变量范围过滤pandas df

new9mtju  于 2023-04-10  发布在  其他
关注(0)|答案(2)|浏览(166)

我有一个Pandasdf:
| x|
| --------------|
| 十五岁|
| 十二岁|
| 二十五|
| 十六岁|
| 四十一|
我想通过第二个df帧来过滤它
| 变量名称|变量最小值|变量最大值|
| --------------|--------------|--------------|
| x|十五岁|二十|
如果任何人可以帮助一个函数,这将是伟大的。有更多的变量在两个DF,但这是模板

64jmpszr

64jmpszr1#

import pandas as pd

df = pd.DataFrame({"x": [1, 2, 3, 4, 5]})
df2 = pd.DataFrame({"col": ["x"], "min": [2], "max": [4]})
df2.set_index("col", inplace=True)
df[df.loc[:,"x"].between(df2.loc["x", "min"], df2.loc["x", "max"])

像这样的东西可以工作吗?我不使用Pandas太多,所以可能有更好的模式。

jhiyze9q

jhiyze9q2#

我创建了一个带有两个变量x,y的人工示例,但是可以有任意多的变量。
包含实际值的数据存储在名为df的DataFrame中,包含每个变量范围的数据存储在名为ranges_df的DataFrame中。

from typing import List

import pandas as pd

def create_features_mask(
    df: pd.DataFrame, ranges_df: pd.DataFrame, features: List
) -> pd.DataFrame:
    features_mask = pd.Series()

    for feature in features:
        feature_range = ranges_df[ranges_df["Variable Name"] == feature]

        lower = feature_range["Variable Min"].squeeze()
        upper = feature_range["Variable Max"].squeeze()

        feature_mask = df[feature].between(lower, upper)

        features_mask = pd.concat([features_mask, feature_mask], axis=1)

    return features_mask

假设我们有以下dataframes:

x   y
0   10  100
1   20  200
2   30  300
3   40  400
4   50  500

ranges_df DataFrame:

Variable Name   Variable Min    Variable Max
0   x               10              30
1   y               200             300

我们可以将features_mask变量创建为:
features_mask = create_features_mask(df, ranges_df, ["x", "y"])
以及过滤实际 Dataframe
df_masked = df[features_mask]得到:

x       y
0   10.0    NaN
1   20.0    200.0
2   30.0    300.0
3   NaN     NaN
4   NaN     NaN

现在,你可以使用任何你想要的方式来过滤屏蔽的 Dataframe (如果你想这样做的话),例如。
df_masked.dropna(how="all", axis=0),得到:

x       y
0   10.0    NaN
1   20.0    200.0
2   30.0    300.0

df_masked.dropna(how="any", axis=0),得到:

x       y
1   20.0    200.0
2   30.0    300.0

相关问题