Как заменить / назначить блок данных в Pandas кадре данных - PullRequest
1 голос
/ 14 января 2020

У меня есть набор данных с именем test3, похожий (импортированный из Excel):

$ID  $spec    $orient $direct   $rep     $slope   $intercept
9119    1       stance  15b     1       2859.09223  158
9119    2       stance  15b     2       2886.53583  321
9119    3       stance  0       1       2860.91423  21
9119    4       fall    15f     1       2878.9364   326
9119    5       fall    15f     2       2902.0397   45
9120    1       stance  15b     1       1444.91347  654
9120    2       stance  15b     2       1460.09585  23
9120    3       stance  0       1       1470.2588   85
9120    4       fall    15f     1       1481.6892   225
9120    5       fall    15f     2       1475.40215  145

и шаблонный фрейм данных с именем test3mean:

$ID  $spec    $orient $direct   $slope   $intercept
9119    1       stance  15b     nan     nan
9119    2       stance  0       nan     nan
9119    3       fall    15f     nan     nan
9120    1       stance  15b     nan     nan
9120    2       stance  0       nan     nan
9120    3       fall    15f     nan     nan

Я используя Pandas dataframe для вычисления среднего значения $slope и $intercept для повторных измерений в test3 и помещая их в соответствующие столбцы в test3mean:

ID = np.array([9119,9120])
orient = np.array(['stance','fall'])
direct = np.array(['0','15f','15b'])

for i in ID:
    for o in orient:
        for d in direct:
            test3mean[test3mean['$ID']==i][test3mean['$orient']==o][test3mean['$direct']==d][['$slope','$intercept']] = test3[test3['$ID']==i][test3['$orient']==o][test3['$direct']==d][test3['$rep']!=3].mean()[['$slope','$intercept']]

Однако, test3mean не меняется. Мне известно о проблеме копирования и просмотра, и я видел решения df.loc[:,()], но не смог реализовать их для моего конкретного c случая.

Ожидаемый результат после двух шагов l oop будет для test3mean выглядеть так:

$ID  $spec    $orient $direct   $slope       $intercept
9119    1       stance  15b     2872.81403  239.5
9119    2       stance  0       2860.91423  21
9119    3       fall    15f     nan     nan
9120    1       stance  15b     nan     nan
9120    2       stance  0       nan     nan
9120    3       fall    15f     nan     nan

Ответы [ 2 ]

3 голосов
/ 14 января 2020

Используйте DataFrame.groupby:

result = (test3[test3['$rep'].ne(3)].groupby(['$ID','$orient','$direct'],as_index=False)['$slope','$intercept']
                                    .mean())

#    $ID $orient $direct       $slope  $intercept
#0  9119    fall     15f  2890.488050       185.5
#1  9119  stance       0  2860.914230        21.0
#2  9119  stance     15b  2872.814030       239.5
#3  9120    fall     15f  1478.545675       185.0
#4  9120  stance       0  1470.258800        85.0
#5  9120  stance     15b  1452.504660       338.5

Если вам нужно объединить с test3mean, используйте DataFrame.merge с how ='left':

(test3mean.drop(['$slope','$intercept'],axis=1)
          .merge(result,on=['$ID','$orient','$direct'],how='left'))

Выход

    $ID  $spec $orient $direct       $slope  $intercept
0  9119      1  stance     15b  2872.814030       239.5
1  9119      2  stance       0  2860.914230        21.0
2  9119      3    fall     15f  2890.488050       185.5
3  9120      1  stance     15b  1452.504660       338.5
4  9120      2  stance       0  1470.258800        85.0
5  9120      3    fall     15f  1478.545675       185.0
3 голосов
/ 14 января 2020

Взгляните на это:

df.groupby(['$ID','$orient','$direct'], as_index=False)[['$slope','$intercept']].mean()

Вывод:

    $ID $orient $direct       $slope  $intercept
0  9119    fall     15f  2890.488050       185.5
1  9119  stance       0  2860.914230        21.0
2  9119  stance     15b  2872.814030       239.5
3  9120    fall     15f  1478.545675       185.0
4  9120  stance       0  1470.258800        85.0
5  9120  stance     15b  1452.504660       338.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...