Создайте пустой фрейм данных dask и добавьте к нему значения - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть фрейм данных, как показано на рисунке, я хочу взять среднее значение по столбцу «пробный». Для каждого предмета, условия и образца (когда все эти три столбца имеют значение один), возьмите среднее значение данных по пробному столбцу (100 строк).

то, что я сделал в пандах, выглядит следующим образом

sub_erp_pd= pd.DataFrame()
for j in range(1,4):
    sub_c=subp[subp['condition']==j]
    for i in range(1,3073):
        sub_erp_pd=sub_erp_pd.append(sub_c[sub_c['sample']==i].mean(),ignore_index=True)

Но это займет много времени .. Так что я думаю использовать Dask вместо Pandas. Но в сумме у меня возникла проблема при создании пустого фрейма данных. Как будто мы создаем пустой фрейм данных в пандах и добавляем к нему данные.

изображение фрейма данных

как подсказал @edesz, я внес изменения в свой подход
EDIT

%%time
sub_erp=pd.DataFrame()
for subno in progressbar.progressbar(range(1,82)):
    try:
        sub=pd.read_csv('../input/data/{}.csv'.format(subno,subno),header=None)
    except:
        sub=pd.read_csv('../input/data/{}.csv'.format(subno,subno),header=None)    
    sub_erp=sub_erp.append(sub.groupby(['condition','sample'], as_index=False).mean())

Чтение файла с использованием панд занимает 13,6 секунды, а при чтении файла с использованием dask - 61,3 мс. Но в сумме у меня проблемы с добавлением.

1 Ответ

0 голосов
/ 13 апреля 2019

Если я правильно понимаю, нужно

  • используйте groupby (подробнее здесь ) для группировки столбцов subject, condition и sample
    • это соберет все строки, которые имеют одинаковое значение в каждом из этих трех столбцов, в одну группу
  • взять среднее значение, используя .mean()
    • это даст вам среднее значение в каждой группе

Генерировать некоторые фиктивные данные

df = df = pd.DataFrame(np.random.randint(0,100,size=(100, 3)),
                        columns=['trial','condition','sample'])
df.insert(0,'subject',[1]*10 + [2]*30 + [5]*60)

print(df.head())
   subject  trial  condition  sample
0        1     71         96      34
1        1      2         89      66
2        1     90         90      81
3        1     93         43      18
4        1     29         82      32

Подход Панд

Агрегируй и бери mean

df_grouped = df.groupby(['subject','condition','sample'], as_index=False)['trial'].mean()

print(df_grouped.head(15))
    subject  condition  sample  trial
0         1         18      24     89
1         1         43      18     93
2         1         67      47     81
3         1         82      32     29
4         1         85      28     97
5         1         88      13     48
6         1         89      59     23
7         1         89      66      2
8         1         90      81     90
9         1         96      34     71
10        2          0      81     19
11        2          2      39     58
12        2          2      59     94
13        2          5      42     13
14        2          9      42      4

Dask подход

Шаг 1. Импорт

import dask.dataframe as dd
from dask.diagnostics import ProgressBar

Шаг 2. Конвертировать Pandas DataFrame в Dask DataFrame, используя .from_pandas

ddf = dd.from_pandas(df, npartitions=2)

Шаг 3. Соберите и возьмите mean

ddf_grouped = (
    ddf.groupby(['subject','condition','sample'])['trial']
        .mean()
        .reset_index(drop=False)
            )

with ProgressBar():
    df_grouped = ddf_grouped.compute()
[                                        ] | 0% Completed |  0.0s
[########################################] | 100% Completed |  0.1s

print(df_grouped.head(15))
    subject  condition  sample  trial
0         1         18      24     89
1         1         43      18     93
2         1         67      47     81
3         1         82      32     29
4         1         85      28     97
5         1         88      13     48
6         1         89      59     23
7         1         89      66      2
8         1         90      81     90
9         1         96      34     71
10        2          0      81     19
11        2          2      39     58
12        2          2      59     94
13        2          5      42     13
14        2          9      42      4
...