Чтение значений массива в файле с помощью pandas

#python #pandas

#python #pandas

Вопрос:

У меня есть CSV-файл со значениями массива в одном столбце. Вы можете увидеть данные здесь (ссылка на диск).

Я использую этот код df = pd.read_csv('class_ 0_0_data.csv', sep=",") , и если вы проверите, df.dtypes все столбцы относятся к объектному типу. Как вы меняете это на float?

Я пытался использовать df['CpuTemperature'] = df['CpuTemperature'].astype(float) , но он возвращает

не удалось преобразовать строку в float

Я пытался использовать df['CpuTemperature'] = pd.to_numeric(df['CpuTemperature'],errors='coerce') , но он возвращает все значения в NaN.

Кто-нибудь знает, как прочитать файл в полезные значения? Я также хочу изменить все столбцы с object на float, а не только CpuTemperature. Спасибо!

Редактировать: ожидаемый результат, что-то вроде этого, поэтому я могу использовать значение из каждого элемента в массиве, например, для построения графика.

 |     |    CpuTemperature     |
|     |  0  |  1  |  2  |  3  |
| --- | ----------------------|
| 0   |56.75|44.75|3.52 |47.83|
| 1   |48.75|42.25|2.39 |45.00|
 

до сих пор я использую df = pd.read_csv('class_ 0_0_data.csv', converters={'class_ 0_0_data': lambda x: np.array(x)}, index_col=0).T

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

1. Из того, что я могу сказать, ваш столбец содержит то, что выглядит как списки. Не могли бы вы уточнить, как должен выглядеть конечный результат?

2. @ap1997 Привет, пожалуйста, проверьте мое редактирование, чтобы увидеть ожидаемый результат. Спасибо

Ответ №1:

Вы могли бы передать конвертер read_csv . class_ 0_0_data Столбцы содержат строковое представление списков списков, с которыми можно анализировать ast.literal_eval . Сложная часть заключается в том, что эти списки могут содержать nan , которые будут подавляться literal_eval . Возможный способ — заключить их в кавычки, чтобы преобразовать их в строки, а затем изменить их обратно на правильные np.nan значения:

 def convert(x):
    x = x.replace("nan", "'nan'")
    lst = ast.literal_eval(x)
    lst = [[x if x != 'nan' else np.nan for x in i] for i in lst]
    return np.array(lst)
 

Мы должны получить фрейм данных, содержащий ожидаемые np.ndarrays в его class_ 0_0_data столбце.

Как только фрейм данных загружен, мы можем разнести его, вычислить номера строк с groupby cumcount помощью и , снова разнести его и вычислить номера столбцов. Затем простой свод должен дать ожидаемый формат:

 df = pd.read_csv('class_ 0_0_data.csv',
                 converters={'class_ 0_0_data': convert})
df.columns = ['name', 'data']

df = df.explode('data')
df['row'] = df.groupby('name').cumcount()

df = df.explode('data')
df['col'] = df.groupby(['name', 'row']).cumcount()

df = df.pivot(index='row', columns=['name', 'col'], values='data').astype('float64')
 

В итоге у нас есть фрейм данных, содержащий столбцы float64 с начальной частью (заданной df.head(10) ):

 name CpuTemperature         ... ValidFrameOptrisPIIRCamera           
col               0      1  ...                          0          1
row                         ...                                      
0             56.75  44.75  ...                      259.0  27.582899
1             48.75  42.25  ...                      273.0  27.058227
2             47.50  42.00  ...                      272.0  26.907842
3             48.25  42.25  ...                      271.0  26.968238
4             50.00  42.50  ...                      271.0  26.969415
5             52.00  42.25  ...                      271.0  26.935518
6             50.00  40.50  ...                      270.0  26.886856
7             46.50  40.50  ...                      271.0  26.925594
8             47.75  41.00  ...                      271.0  26.975050
9             49.25  41.00  ...                      270.0  26.888554

[10 rows x 246 columns]
 

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

1. Спасибо за ответ! Однако выходные данные с конвертерами и без них выглядят одинаково, и данные по-прежнему имеют объектный тип данных. Как я могу использовать данные массива, например, для построения графика?

2. @Gebran: данные во втором столбце представляют собой np.ndarrays, просто посмотрите мое редактирование, которое демонстрирует это. Конечно, его можно преобразовать, но я не знаю, как преобразовать массив в скалярное число с плавающей точкой. Вы должны показать ожидаемый результат…

3. Привет, пожалуйста, проверьте мое редактирование, чтобы увидеть ожидаемый результат. Спасибо. @Serge

4. @Gebran: Это действительно было более сложным, чем мое первоначальное решение, но теперь оно должно быть правильным.

5. @Gebran: если это сработает, вы должны принять ответ (флажок рядом с ним), чтобы четко показать будущим читателям, что вам больше не нужна помощь с этим вопросом.