#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: если это сработает, вы должны принять ответ (флажок рядом с ним), чтобы четко показать будущим читателям, что вам больше не нужна помощь с этим вопросом.