Pandas groupy - 我可以将它用于不同行集的不同功能吗?
Pandas groupy - Can I use it for different functions on different sets of rows?
我有一个大型 pandas 数据框,其中包含许多不同类型的观察结果,需要应用不同的模型。一列是要应用的模型,可以映射到接受数据帧和 returns 数据帧的 python 函数。一种方法是只执行 3 个步骤:
- 将数据帧拆分为 n 个数据帧,用于 n 个不同的模型
- 运行 每个数据帧通过每个函数
- 在最后连接输出数据帧
这最终不是非常灵活,尤其是在添加和删除模型时。查看 groupby 似乎我应该能够利用它来使它在代码方面看起来更清晰,但我一直无法找到一种模式来满足我的需求。
此外,由于此数据的大小,使用应用并不是特别有用,因为它会大大减慢 运行时间。
快速示例:
df = pd.DataFrame({"model":["a","b","a"],"a":[1,5,8],"b":[1,4,6]})
def model_a(df):
return df["a"] + df["b"]
def model_b(df):
return df["a"] - df["b"]
model_map = {"a":model_a,"b":model_b}
results = df.groupby("model")...
预期结果看起来像 [2,1,14]。有没有一种简单的代码方式来做到这一点?请注意,实际模型要复杂得多,可能涉及数百个具有大量转换的变量,这只是一个玩具示例。
谢谢!
您可以使用 groupby/apply
:
x.name
包含组名,这里是a
和b
x
包含子数据帧
df['r'] = df.groupby('model') \
.apply(lambda x: model_map[x.name](x)) \
.droplevel(level='model')
>>> df
model a b r
0 a 1 1 2
1 b 5 4 1
2 a 8 6 14
或者您可以使用 np.select
:
>>> np.select([df['model'] == 'a', df['model'] == 'b'],
[model_a(df), model_b(df)])
array([ 2, 1, 14])
我有一个大型 pandas 数据框,其中包含许多不同类型的观察结果,需要应用不同的模型。一列是要应用的模型,可以映射到接受数据帧和 returns 数据帧的 python 函数。一种方法是只执行 3 个步骤:
- 将数据帧拆分为 n 个数据帧,用于 n 个不同的模型
- 运行 每个数据帧通过每个函数
- 在最后连接输出数据帧
这最终不是非常灵活,尤其是在添加和删除模型时。查看 groupby 似乎我应该能够利用它来使它在代码方面看起来更清晰,但我一直无法找到一种模式来满足我的需求。
此外,由于此数据的大小,使用应用并不是特别有用,因为它会大大减慢 运行时间。
快速示例:
df = pd.DataFrame({"model":["a","b","a"],"a":[1,5,8],"b":[1,4,6]})
def model_a(df):
return df["a"] + df["b"]
def model_b(df):
return df["a"] - df["b"]
model_map = {"a":model_a,"b":model_b}
results = df.groupby("model")...
预期结果看起来像 [2,1,14]。有没有一种简单的代码方式来做到这一点?请注意,实际模型要复杂得多,可能涉及数百个具有大量转换的变量,这只是一个玩具示例。
谢谢!
您可以使用 groupby/apply
:
x.name
包含组名,这里是a
和b
x
包含子数据帧
df['r'] = df.groupby('model') \
.apply(lambda x: model_map[x.name](x)) \
.droplevel(level='model')
>>> df
model a b r
0 a 1 1 2
1 b 5 4 1
2 a 8 6 14
或者您可以使用 np.select
:
>>> np.select([df['model'] == 'a', df['model'] == 'b'],
[model_a(df), model_b(df)])
array([ 2, 1, 14])