numpy 使用np.where返回基于条件的df行的平均值

ifmq2ha2  于 2023-02-12  发布在  其他
关注(0)|答案(4)|浏览(157)

假设我有下面的代码

import pandas as pd
import numpy as np

flag = pd.DataFrame({'flag': [ [], ['red'], ['red, green'], ['red, blue'], ['blue'] ]})
colors_values = pd.DataFrame({'red': [1, 1, 1, 1, 1], 'green': [2, 2, 2, 2, 2], 'blue': [4, 4, 4, 4, 4]})

第一节第一节第一节第一节第一次
我有一个名为“flag”的一维df,每行包含一个颜色列表(红、绿色、蓝),还有一个df“colors_values”包含这些颜色名称,它们有相同的行数。
我的目标是使用np.where返回基于'flag'的'colors_values'的每一行值的平均值。

如果有更好/更快的方法来代替使用np.where,我想知道。

f0brbegy

f0brbegy1#

您可以安排 Dataframe 之间匹配的颜色名称,如下所示:

means = colors_values.apply(lambda x: x[flag.iloc[x.name][0]].mean(), axis=1)
0    NaN
1    1.0
2    1.5
3    2.5
4    4.0
c86crjj0

c86crjj02#

Pandas合并是相当快的,如果你允许一个斜坡上升时间位,你可以做一个合并/分组:

df_flag = flag.explode('flag').reset_index()
df_colors = colors_values.reset_index().melt(ignore_index=False, var_name='flag').reset_index()
df_flag = df_flag.merge(df_colors, on=['index', 'flag'], how='left')

df_grouped = df_flag.groupby(['index'])['value'].mean()
3ks5zfa0

3ks5zfa03#

快速解决方案
from sklearn.preprocessing import MultiLabelBinarizer

# encode the colors into indicator variables
mask = MultiLabelBinarizer().fit_transform(flag['flag'])

# mask the color values where indicator is zero then calculate mean
result = colors_values.sort_index(axis=1).mask(mask == 0).mean(axis=1)
结果
0    NaN
1    1.0
2    1.5
3    2.5
4    4.0
dtype: float64
bjg7j2ky

bjg7j2ky4#

可以使用str.get_dummies()并乘以color_values df

(flag['flag']
.str[0]
.str.get_dummies(sep=', ')
.mul(colors_values)
.where(lambda x: x.ne(0))
.mean(axis=1))

输出:

0    NaN
1    1.0
2    1.5
3    2.5
4    4.0

相关问题