【发布时间】:2019-08-13 10:27:21
【问题描述】:
对于我的大学作业,我必须生成一个包含世界上所有机场距离的 csv 文件...问题是我的 csv 文件重量为 151Mb。我想尽可能减少它:这是我的 csv:
这是我的代码:
# drop all features we don't need
for attribute in df:
if attribute not in ('NAME', 'COUNTRY', 'IATA', 'LAT', 'LNG'):
df = df.drop(attribute, axis=1)
# create a dictionary of airports, each airport has the following structure:
# IATA : (NAME, COUNTRY, LAT, LNG)
airport_dict = {}
for airport in df.itertuples():
airport_dict[airport[3]] = (airport[1], airport[2], airport[4], airport[5])
# From tutorial 4 soulution:
airportcodes=list(airport_dict)
airportdists=pd.DataFrame()
for i, airport_code1 in enumerate(airportcodes):
airport1 = airport_dict[airport_code1]
dists=[]
for j, airport_code2 in enumerate(airportcodes):
if j > i:
airport2 = airport_dict[airport_code2]
dists.append(distanceBetweenAirports(airport1[2],airport1[3],airport2[2],airport2[3]))
else:
# little edit: no need to calculate the distance twice, all duplicates are set to 0 distance
dists.append(0)
airportdists[i]=dists
airportdists.columns=airportcodes
airportdists.index=airportcodes
# set all 0 distance values to NaN
airportdists = airportdists.replace(0, np.nan)
airportdists.to_csv(r'../Project Data Files-20190322/distances.csv')
我还尝试在保存之前对其重新编制索引:
# remove all NaN values
airportdists = airportdists.stack().reset_index()
airportdists.columns = ['airport1','airport2','distance']
但结果是一个包含 3 列和 1700 万列的数据帧以及 419Mb 的磁盘大小......完全没有改进......
你能帮我缩小我的 csv 文件的大小吗?谢谢!
【问题讨论】:
-
17 000 000 行 * 3 列 / 1024 / 1024 = 48 Mb 如果假设每行一个字符 151 Mb = 平均每行 3 个字符......你想如何缩小你的输出文件?不可能?除非您希望多个文件更小
-
谢谢@Frenchy,是的,我不确定是否可以减小文件尺寸,这就是我要问的哦
-
你有几个机场?
-
@Frenchy 9541 机场
-
不显着。 9541 个机场意味着您有大约 9100 万个机场对,如果您忽略重复项,则为 4550 万个。对于大多数人来说,距离需要 3-4 个字符,分隔符需要一个字符。考虑到 151 MiB 是相当不错的。 CSV 作为纯文本不是很节省空间。除非您使用压缩和/或二进制格式,否则您不会做得更好。 |为什么还是有问题?
标签: python pandas csv dataframe compression