【问题标题】:How to implement python custom function on dictionary of dataframes如何在数据框字典上实现python自定义函数
【发布时间】:2021-08-29 22:32:36
【问题描述】:

我有一个包含 3 个数据框的字典。

如何为字典中的每个数据框实现自定义函数。

简单来说,我想应用函数find_outliers,如下所示

# User defined function : find_outliers
#(I)
from scipy import stats
outlier_threshold = 1.5   
ddof = 0   

def find_outliers(s: pd.Series):
    outlier_mask = np.abs(stats.zscore(s, ddof=ddof)) > outlier_threshold
    # replace boolean values with corresponding strings
    return ['background-color:blue' if val else '' for val in outlier_mask]

到下面的数据框字典dict_of_dfs

#  the dataset 
import numpy as np
import pandas as pd

df = { 
         'col_A':['A_1001', 'A_1001', 'A_1001', 'A_1001', 'B_1002','B_1002','B_1002','B_1002','D_1003','D_1003','D_1003','D_1003'],
        'col_X':[110.21, 191.12, 190.21, 12.00, 245.09,4321.8,122.99,122.88,134.28,148.14,161.17,132.17],
        'col_Y':[100.22,199.10, 191.13,199.99, 255.19,131.22,144.27,192.21,7005.15,12.02,185.42,198.00],
        'col_Z':[140.29, 291.07, 390.22, 245.09, 4122.62,4004.52,395.17,149.19,288.91,123.93,913.17,1434.85]
}
df = pd.DataFrame(df)
df

#dictionary_of_dataframes
#(II)
dict_of_dfs=dict(tuple(df.groupby('col_A')))

最后,标记dict_of_dfs 的每个df 中的异常值

# end goal is to have find/flag outliers in each `df` of the `dict_of_dfs`

#(III)
desired_cols = ['col_X','col_Y','col_Z'] 
dict_of_dfs.style.apply(find_outliers, subset=desired_cols)

总之,我想将I 应用于II,最后在III 中标记异常值 感谢您的尝试。 :)

所需的输出应如下所示,但对于三个数据帧

【问题讨论】:

    标签: python pandas dictionary for-loop apply


    【解决方案1】:

    这可能不是您想要的,但这是我的处理方式,但是您必须弄清楚函数的细节,因为您编写它是为了接收一个系列而不是一个数据帧。 Groupby apply() 将发送行的子集,然后您可以对该子集执行操作并返回结果。

    供参考:

    在函数内部,您可以像这样处理所有列:

    def find_outliers(x):
        for col in ['col_X','col_Y','col_Z']:
            outlier_mask = np.abs(stats.zscore(x[col], ddof=ddof)) > outlier_threshold
            x[col] = ['outlier' if val else '' for val in outlier_mask]
        return x
    
    
    newdf = df.groupby('col_A').apply(find_outliers)
    
         col_A    col_X    col_Y col_Z
    0   A_1001           outlier
    1   A_1001
    2   A_1001
    3   A_1001  outlier
    4   B_1002           outlier
    5   B_1002  outlier
    6   B_1002
    7   B_1002
    8   D_1003           outlier
    9   D_1003
    10  D_1003
    

    【讨论】:

    • 感谢您的尝试,但是,我想将 find_outliers 函数应用于单个 df - A_1001 B_1002D_1003 而不是一个大数据框(因此 @987654327 @)。简而言之,我希望将您的方法复制到三个 dfs,类似于for loop
    • 那不正确。 groupby.apply() 如您所描述的,将该函数应用于每个子集。它只是返回一个完整的数据框。
    • 如果函数为每个子集返回错误的结果,则需要更新函数。
    • 查看你的代码快照,我想先拆分dfs,然后在每个df中找到异常值。
    • 我想我不明白为什么您要执行创建字典的额外步骤,然后在我的代码执行相同操作时循环该字典。你能发布解决方案应该是什么吗?它是字典还是数据框?如果您可以发布您的预期输出而不是描述它,我可能会提供更多帮助。还要重申一下,在您无法将 df 作为系列传递之前设置参数的方式,因此不清楚您希望如何将函数应用于数据帧的每一列;这就是我遍历这些列的原因。以您想要的方式发布预期结果会有所帮助。
    猜你喜欢
    • 2017-11-17
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-14
    • 2018-12-11
    • 1970-01-01
    • 2021-07-10
    相关资源
    最近更新 更多