我有一个csv文件,其中一列中有一个数组值。您可以在此处查看数据(驱动器链接)。
我使用这个代码df = pd.read_csv('class_ 0_0_data.csv', sep=",")
,如果使用df.dtypes
进行检查,则所有列都是对象类型。你怎么把它变成浮子?
我尝试使用df['CpuTemperature'] = df['CpuTemperature'].astype(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
您可以将转换器传递给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)
我们应该在其class_ 0_0_data
列中获得一个包含预期np.ndarray的数据帧。
一旦加载了数据帧,我们就可以对其进行分解,用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]