我有一个Pandasdf:| x|| --------------|| 十五岁|| 十二岁|| 二十五|| 十六岁|| 四十一|我想通过第二个df帧来过滤它| 变量名称|变量最小值|变量最大值|| --------------|--------------|--------------|| x|十五岁|二十|如果任何人可以帮助一个函数,这将是伟大的。有更多的变量在两个DF,但这是模板
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太多,所以可能有更好的模式。
jhiyze9q2#
我创建了一个带有两个变量x,y的人工示例,但是可以有任意多的变量。包含实际值的数据存储在名为df的DataFrame中,包含每个变量范围的数据存储在名为ranges_df的DataFrame中。
x,y
df
ranges_df
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"])以及过滤实际 Dataframedf_masked = df[features_mask]得到:
features_mask = create_features_mask(df, ranges_df, ["x", "y"])
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),得到:
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),得到:
df_masked.dropna(how="any", axis=0)
x y 1 20.0 200.0 2 30.0 300.0
2条答案
按热度按时间64jmpszr1#
像这样的东西可以工作吗?我不使用Pandas太多,所以可能有更好的模式。
jhiyze9q2#
我创建了一个带有两个变量
x,y
的人工示例,但是可以有任意多的变量。包含实际值的数据存储在名为
df
的DataFrame中,包含每个变量范围的数据存储在名为ranges_df
的DataFrame中。假设我们有以下dataframes:
ranges_df
DataFrame:我们可以将features_mask变量创建为:
features_mask = create_features_mask(df, ranges_df, ["x", "y"])
以及过滤实际 Dataframe
df_masked = df[features_mask]
得到:现在,你可以使用任何你想要的方式来过滤屏蔽的 Dataframe (如果你想这样做的话),例如。
df_masked.dropna(how="all", axis=0)
,得到:df_masked.dropna(how="any", axis=0)
,得到: