内卷化(高达精度)操作"dataframe to csv"和"csv to dataframe"



我有一个数值上非常密集的矢量化python函数def f(x,y),包含两个变量,我在np上计算(使用frompyfunc和广播)。x的数组X = [x0, ...., xN-1]和一个np。数组yY = [y0, ...., yM-1], N,M在5到10000之间。这将返回一个2D np结果。形状为(N,M)的数组Z包含z[i,j],使得z[i,j] = f(X[i], Y[j])用于所有i和j。函数f进行了优化,这已经花费了大约45分钟。当我使用Z编写、调试配置文件代码时,我想要"保存"。"matrix"csv文件中的Z,格式如下:

0.25        0.5         0.75        1           1.25
0.1 0.876155737 0.888282356 0.904731158 0.910351368 0.906284762
0.2 0.810528369 0.797068044 0.806520168 0.805697704 0.80659234
0.3 0.696280633 0.704307378 0.703540949 0.705198518 0.708672067
0.4 0.601264163 0.605194    0.607882    0.611616655 0.612408848
0.5 0.502995372 0.509209974 0.513651558 0.516065068 0.51994982

(这是我的"矩阵"的左上角的一小部分,第一列是X的开始,第一行是Y的开始,其余的是矩阵,这意味着例如f(0.4, 0.75) = 0.607882

我很自然地使用了pd.dataframe,如下所示:

df = pd.DataFrame(data=Z, columns=Y, index=X)
df.to_csv(some_full_path_filename)

,实际上csv文件看起来像我想要的样子,也就是说,就像上面矩阵的一小部分。

现在如果我

df2 = pd.read_csv(some_full_path_filename)
df2 .to_csv(some_full_path_filename2, index=False)

第二个CSV文件如下:

Unnamed:0   0.25        0.5         0.75        1           1.25
0.1         0.876155737 0.888282356 0.904731158 0.910351368 0.906284762
0.2         0.810528369 0.797068044 0.806520168 0.805697704 0.80659234
0.3         0.696280633 0.704307378 0.703540949 0.705198518 0.708672067
0.4         0.601264163 0.605194    0.607882    0.611616655 0.612408848
0.5         0.502995372 0.509209974 0.513651558 0.516065068 0.51994982

,这是最接近第一个csv文件,我成功地得到我自己的熊猫。当然,dfdf2这两个数据框是不"相等"的。

因此问题的标题是:一个操作是对合的当应用它两次时给出起始值,然后不,我的数据框架到csv文件"并将csv文件转换为数据框架。操作不是对合的。

准确地说,在数据帧和csv文件中有浮点舍入差异,比如在一个矩阵中我可以有0.0072618782055291,但在另一个相同的地方我可以有0.0072618782055290999999999:这对我来说不是问题。

我想要的是我的数据框架到csv文件"并将csv文件转换为数据框架。使数据帧和CSV文件在结构上相等的操作。

"Structurally"意义:

  • 用于csv文件:在每个"单元格">
  • 中具有相同的值(直至四舍五入)和字符串(如果有的话)数据帧的
  • :当然它们不会等于本身,因为它们没有"point"到分配内存中的相同位置,但我希望它们在某种意义上是相等的,即它们中的所有数字/文本值表示相同的数字/字符串(直到数字四舍五入)

应该是不同的,因为在csv中所有的数据都像字符串一样保存,所以如果使用index_col=0在这里是正确创建FloatIndex,但列名称是字符串,也列中的数据应该以不同的方式解析(例如,如果混合字符串和数字):

f = 'file.csv'
df.to_csv(f)
df = pd.read_csv(f, index_col=0)
print (df)
0.25       0.5      0.75         1      1.25
0.1  0.876156  0.888282  0.904731  0.910351  0.906285
0.2  0.810528  0.797068  0.806520  0.805698  0.806592
0.3  0.696281  0.704307  0.703541  0.705199  0.708672
0.4  0.601264  0.605194  0.607882  0.611617  0.612409
0.5  0.502995  0.509210  0.513652  0.516065  0.519950

print (df.columns)
Index(['0.25', '0.5', '0.75', '1.0', '1.25'], dtype='object')

另一个想法是使用pickle,read_pickleDataFrame.to_pickle来正确保存带有列和索引的dataframe:

print (df.columns)
Float64Index([0.25, 0.5, 0.75, 1.0, 1.25], dtype='float64')
f = 'file'
df.to_pickle(f)
df1 = pd.read_pickle(f)
print (df1)
0.25      0.50      0.75      1.00      1.25
0.1  0.876156  0.888282  0.904731  0.910351  0.906285
0.2  0.810528  0.797068  0.806520  0.805698  0.806592
0.3  0.696281  0.704307  0.703541  0.705199  0.708672
0.4  0.601264  0.605194  0.607882  0.611617  0.612409
0.5  0.502995  0.509210  0.513652  0.516065  0.519950
print (df1.columns)
Float64Index([0.25, 0.5, 0.75, 1.0, 1.25], dtype='float64')
print (df1.equals(df))
True

最新更新