Добавление словаря с уникальными ключами в DataFrame без уникальных ключей - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь создать описательную статистику для DataFrame с помощью GroupBy и поместить эти значения обратно в 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

Предложения по улучшению моего кода, или мой общий метод приветствуется.

1 Ответ

1 голос
/ 18 июня 2019

Если требуется один столбец, заполненный 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.describe с DataFrame.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 function:

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
...