#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. Да, я думаю, это работает. Я знал, что делаю это намного сложнее, чем нужно!