2014-11-07 2 views
2

У меня есть dataframe, для которого требуется подмножество столбцов, чтобы иметь записи с несколькими значениями. Ниже приводится dataframe с колонкой «Runtimes», которая имеет время автономной работы программы в различных условиях:Как использовать списки в качестве значений в pandas dataframe?

df = [{"condition": "a", "runtimes": [1,1.5,2]}, {"condition": "b", "runtimes": [0.5,0.75,1]}] 
df = pandas.DataFrame(df) 

это делает dataframe:

condition  runtimes 
0   a  [1, 1.5, 2] 
1   b [0.5, 0.75, 1] 

, как я могу работать с этим dataframe и получить панды обрабатывать его значения как числовой список? например, вычислить среднее значение для столбца «runtimes» через строки?

df["runtimes"].mean() 

выдает ошибку: "Could not convert [1, 1.5, 2, 0.5, 0.75, 1] to numeric"

Было бы полезно, чтобы работать с этим dataframes, а также сериализации их как CSV файлов, в список как: [1, 1.5, 2] преобразуется в "1,1.5,2", так что это еще один запись в файл csv.

ответ

7

Такое ощущение, что вы пытаетесь сделать Панды быть что-то это не так. Если у вас всегда есть 3 режима работы, вы можете сделать 3 столбца. Однако более Панды-esqe подход по нормализации данных (независимо от того, сколько различных испытаний у вас есть) на что-то вроде этого:

df = [{"condition": "a", "trial": 1, "runtime": 1}, 
     {"condition": "a", "trial": 2, "runtime": 1.5}, 
     {"condition": "a", "trial": 3, "runtime": 2}, 
     {"condition": "b", "trial": 1, "runtime": .5}, 
     {"condition": "b", "trial": 2, "runtime": .75}, 
     {"condition": "b", "trial": 3, "runtime": 1}] 
df = pd.DataFrame(df) 

, то вы можете

print df.groupby('condition').mean() 


      runtime trial 
condition     
a    1.50  2 
b    0.75  2 

Концепция здесь должна держать данные табличные и только одно значение для ячейки. Если вы хотите выполнять вложенные функции списка, вы должны использовать списки, а не кадры данных Pandas.

3

Похоже, панды пытаются скомпоновать все списки в серии и делить на количество строк. Это приводит к конкатенации списка, и результат не дает проверки числового типа. Это объясняет список в вашей ошибке.

Вы можете вычислить среднее значение, как это:

df['runtimes'].apply(numpy.mean) 

Помимо этого, панды не нравится работать со списками как ценности. Если ваши данные являются табличными, рассмотрите разбивку списка на три отдельные столбцы.

Сериализация столбец будет работать аналогичным образом:

df['runtimes'].apply(lambda x: '"' + str(x)[1:-1] + '"') 
Смежные вопросы