Советы по созданию нового фрейма данных Pandas со средствами

#python #pandas

#python #pandas

Вопрос:

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

 sampleIDList = df['sample'].unique()
compoundIDList = df['compound'].unique()

df0 = df.loc[df['sample'] == sampleIDList[0]]
concMeans0 = []
for compound in compoundIDList:
    dataSubset = df0.loc[df0['compound'] == compound]
    concMeans0.append(dataSubset['ppb'].mean())

df1 = df.loc[df['sample'] == sampleIDList[1]]
concMeans1 = []
for compound in compoundIDList:
    dataSubset = df1.loc[df1['compound'] == compound]
    concMeans1.append(dataSubset['ppb'].mean())

newdf = pd.DataFrame({
    sampleIDList[0]: concMeans0,
    sampleIDList[1]: concMeans1
})

newdf = newdf.set_index(compoundIDList)
  

В этом примере есть только два примера. На самом деле у меня есть много примеров, поэтому нецелесообразно продолжать вручную создавать фрейм данных по столбцам, и должен быть лучший способ сделать это. Любая помощь очень ценится.

Редактировать: макет набора данных выглядит примерно так (извините за форматирование):

     sample      compound    ppb
0   sample1     water       103
1   sample1     sugar       15
2   sample1     acid        4
3   sample1     water       107
4   sample1     sugar       19
5   sample1     acid        8
6   sample1     water       104
7   sample1     sugar       18
8   sample1     acid        5
9   sample2     water       115
10  sample2     sugar       54
11  sample2     acid        11
12  sample2     water       126
13  sample2     sugar       65
14  sample2     acid        9
15  sample2     water       124
16  sample2     sugar       44
17  sample2     acid        13
18  sample3     water       112
19  sample3     sugar       34
20  sample3     acid        23
21  sample3     water       114
22  sample3     sugar       35
23  sample3     acid        25
24  sample3     water       110
25  sample3     sugar       33
26  sample3     acid        22

  

и результат, который я хочу, это что-то вроде:

         sample1     sample2     sample3
water   104.666667  121.666667  112.000000
sugar   17.333333   54.333333   34.000000
acid    5.666667    11.000000   23.333333
  

Комментарии:

1. можете ли вы поделиться некоторыми данными? это выглядит как простое использование pivot()

Ответ №1:

Это копирует данные, которые вы описываете. Вычислите, mean() затем используйте unstack() , чтобы создать образец столбца.

 
df = pd.DataFrame([{"compound":c, "sample":s, "ppd":random.uniform(1,4)} for ppd in range(5) for s in list("12345") 
 for c in list("ABCDEF")])

print(df.shape)
df.groupby(["compound","sample"]).mean().unstack()
  

вывод

 (150, 3)
               ppd                                        
sample           1         2         3         4         5
compound                                                  
A         2.288282  2.742844  2.552831  2.824470  3.070498
B         2.988021  1.923380  1.827858  2.729828  2.632676
C         2.108418  2.307806  2.585408  2.550337  2.410051
D         2.582997  2.300148  2.304127  2.748143  2.887644
E         2.293815  3.166805  2.523686  2.567653  3.576171
F         2.849908  2.707548  2.928473  2.625358  2.691861
  

Комментарии:

1. Да, я думаю, это работает. Я знал, что делаю это намного сложнее, чем нужно!