我有一个要写入二进制文件的pandas DataFrame,但是df包含混合的dtypes。如果使用df.values.tofile()
,则无法指定其他dtypes(即使在以下示例中指定了astype('f4, f4, i4, i4').tofile()
)。目前的解决方法是使用struct
,但速度很慢!
import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.random.random(size=(10, 4)) * 10, columns=['f1', 'f2', 'i1', 'i2'])
df.i1 = df.i1.astype(int)
df.i2 = df.i2.astype(int)
with open('tmp', 'w') as ply:
for ix, row in df.iterrows():
ply.write(struct.pack('<ffii', *row.values))
我正在创建一个.ply
文件,该文件要求正确格式化数据。
答案 0 :(得分:0)
解决方案似乎是df.to_records(index=False).tobytes()
import pandas as pd
import numpy as np
df = pd.DataFrame(data=np.random.random(size=(10, 4)) * 10, columns=['f1', 'f2', 'i1', 'i2'])
df.i1 = df.i1.astype(int)
df.i2 = df.i2.astype(int)
with open('test.dat', 'w') as fh:
fh.write(df.to_records(index=False).tobytes())
arr = np.fromfile('test.dat', dtype='f8, f8, i8, i8')
df2 = pd.DataFrame(arr)
df2.columns = ['f1', 'f2', 'i1', 'i2'] # strange but if columns specified above then df2 == df is False :\
print np.all(df2 == df)