【问题标题】:Adding dictionary with unique keys to DataFrame without unique keys将具有唯一键的字典添加到没有唯一键的 DataFrame
【发布时间】:2019-10-31 18:54:39
【问题描述】:

我正在尝试使用 GroupBy 对 DataFrame 进行描述性统计,并将这些值放回 DataFrame。

我的 DataFrame 包含一个非唯一的流水号,用于标识一个人(匿名),以及一些与每个人相关的值。

例如:

RunNr    Value
1        126
1        158
1        18
2        65
3        31   
3        4

通过使用 GroupBy,我可以计算每个人的描述性统计数据(运行次数),例如标准差。我想将这些重新添加到 DataFrame 中以进行进一步处理(例如在 Word 中制作报告)。

结果应该是这样的:

RunNr    Value    Std
1        126      59,9
1        158      59,9
1        18       59,9
2        65       Nan
3        31       13,5
3        4        13,5

我想出的最佳解决方案是计算标准偏差(和其他统计数据),将它们放入字典中,其中运行数字是键,值是标准偏差。

我现在有一个字典,其中字典中的流水号是唯一键,而它不在 DataFrame 中。我的下一步是遍历字典,并使用 .loc() 将相应的值插入正确的行:

for key, value in self.dict_of_std:
    self.internal_main_df.loc[self.internal_main_df.Fnr == key] = value

我收到此错误:

TypeError: cannot unpack non-iterable float object

对改进我的代码或我的整体方法的建议表示赞赏。

【问题讨论】:

    标签: pandas dataframe statistics data-science python-3.7


    【解决方案1】:

    如果每组需要一列由std 填充,请使用GroupBy.transform 和一个聚合函数,此处为std

    df['Std'] = df.groupby('RunNr')['Value'].transform('std')
    print (df)
       RunNr  Value        Std
    0      1    126  73.357572
    1      1    158  73.357572
    2      1     18  73.357572
    3      2     65        NaN
    4      3     31  19.091883
    5      3      4  19.091883
    

    如果需要更多统计信息,可以使用 DataFrameGroupBy.describeDataFrame.join 来获取新列:

    df1 = df.join(df.groupby('RunNr')['Value'].describe(), on='RunNr')
    print (df1)
       RunNr  Value  count        mean        std   min    25%    50%     75%  \
    0      1    126    3.0  100.666667  73.357572  18.0  72.00  126.0  142.00   
    1      1    158    3.0  100.666667  73.357572  18.0  72.00  126.0  142.00   
    2      1     18    3.0  100.666667  73.357572  18.0  72.00  126.0  142.00   
    3      2     65    1.0   65.000000        NaN  65.0  65.00   65.0   65.00   
    4      3     31    2.0   17.500000  19.091883   4.0  10.75   17.5   24.25   
    5      3      4    2.0   17.500000  19.091883   4.0  10.75   17.5   24.25   
    
         max  
    0  158.0  
    1  158.0  
    2  158.0  
    3   65.0  
    4   31.0  
    5   31.0   
    

    或者可以在GroupBy.agg函数中指定聚合函数:

    df2 = df.join(df.groupby('RunNr')['Value'].agg(['mean','max','std']),  on='RunNr')
    print (df2)
       RunNr  Value        mean  max        std
    0      1    126  100.666667  158  73.357572
    1      1    158  100.666667  158  73.357572
    2      1     18  100.666667  158  73.357572
    3      2     65   65.000000   65        NaN
    4      3     31   17.500000   31  19.091883
    5      3      4   17.500000   31  19.091883
    

    【讨论】:

    • 哇,好快啊。我尝试运行您的代码,我得到: AttributeError: 'SeriesGroupBy' object has no attribute 'Std'
    • @CenturionNOR - 不是拼写错误Std 而不是std ?
    • 我也在尝试理解代码。据我所知,当我运行 groupby 时,我创建了一个新的 DataFrame 对象(而不是 groupby-object 等),并且可以运行与常规 DataFrame 相同的方法;在这种情况下转换()link
    • @CenturionNOR - transform.agg 的聚合数据一样工作,然后创建由聚合值填充的新列。更多关于聚合的信息是here
    • 这就像魔术一样!感谢您花时间详细说明答案而不是发布代码,这有助于我理解并成为更好的程序员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 1970-01-01
    • 2013-02-21
    • 2012-03-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多