Как обрабатывать чистые данные в пандах? - PullRequest
0 голосов
/ 02 мая 2019

Сначала я должен сказать, что я довольно новичок в Python и Pandas, но я хочу использовать их гораздо чаще в будущем, поэтому я экспериментирую с этим.Из-за моей работы я часто использовал Excel и часто сталкивался с проблемой, состоящей в том, что данные (строки) имеют свои атрибуты (столбцы), но иногда некоторые данные (строки) могут иметь третье измерение.Вот простой пример Pandas dataframe, чтобы показать, что я имею в виду:

df = pd.DataFrame(data={"obs":[["test1","test2"],"test1"],
                   "result":[[101,103],200]},index=["subj1","subj2"])
df

                  obs      result
subj1  [test1, test2]  [101, 103]
subj2           test1         200

Как вы вообще справляетесь с этим?Я прочитал термин «аккуратные данные», где каждое значение должно получить свою собственную ячейку.Должен ли я добавить столбцы => obs1, obs2, result1, result2 или добавить строки для каждого отклоняющегося предмета, например: subj1_1, subj1_2, что более целесообразно, поскольку атрибуты (столбцы) остаются прежними.Может ли мультииндексы иметь здесь смысл?Я немного читал об этом, но пока не знаю достаточно, чтобы эффективно их использовать.Я искал эту тему, но ничто не помогло мне конкретнее.

1 Ответ

1 голос
/ 02 мая 2019

В вашем примере я думаю, что subj не очень хороший показатель. Я бы рекомендовал использовать числовой инкрементный индекс или мультииндекс. С этим легче справиться в будущем. Рассмотрим пример:

df = pd.DataFrame(
    data={
        'subj':["subj1","subj1", "subj1", "subj1", "subj2", "subj2","subj2", "subj2", "subj3", "subj3"] ,
        "obs":["test1","test2","test2","test1",'test1','test1','test2','test2','test1','test2'],
        "result":[101,103,105,110, 203,159,193,285,400,543] 
    }
)
df
    subj    obs  result
0  subj1  test1     101
1  subj1  test2     103
2  subj1  test2     105
3  subj1  test1     110
4  subj2  test1     203
5  subj2  test1     159
6  subj2  test2     193
7  subj2  test2     285
8  subj3  test1     400
9  subj3  test2     543

Давайте рассмотрим, что вы хотите вычислить средний результат для каждого уникального subj. Поскольку все точки данных имеют собственную строку, вы можете использовать функции panda: groupby и означает .

df.groupby('subj').mean()
       result
subj         
subj1  104.75
subj2  210.00
subj3  471.50

или если вы хотите вычислить среднее значение для каждого subj и obj

df.groupby(['subj','obs']).mean()
             result
subj  obs          
subj1 test1   105.5
      test2   104.0
subj2 test1   181.0
      test2   239.0
subj3 test1   400.0
      test2   543.0

Если вы встретите точки данных в списках после импорта данных из Excel, я рекомендую написать функцию, которая сделает n строк из 1 и применить к 1 оси

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...