我有一个熊猫数据框,df_test. 它包含一个“大小”列,它表示以字节为单位的大小。我使用以下代码计算了 KB、MB 和 GB:
df_test
df_test = pd.DataFrame([ {'dir': '/Users/uname1', 'size': 994933}, {'dir': '/Users/uname2', 'size': 109338711}, ]) df_test['size_kb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0, grouping=True) + ' KB') df_test['size_mb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0 ** 2, grouping=True) + ' MB') df_test['size_gb'] = df_test['size'].astype(int).apply(lambda x: locale.format("%.1f", x / 1024.0 ** 3, grouping=True) + ' GB') df_test dir size size_kb size_mb size_gb 0 /Users/uname1 994933 971.6 KB 0.9 MB 0.0 GB 1 /Users/uname2 109338711 106,776.1 KB 104.3 MB 0.1 GB [2 rows x 5 columns]
我已经运行了超过 120,000 行,根据 %timeit,每列大约需要 2.97 秒 * 3 = ~9 秒。
无论如何我可以让它更快吗?例如,我是否可以一次返回一列,而不是一次从应用返回一列并运行它 3 次,我可以一次返回所有三列以插入回原始数据帧吗?
我发现的其他问题都想 采用多个值并返回一个值 。我想 取一个值并返回多个列 。
您可以从包含新数据的应用函数中返回一个系列,从而无需迭代三次。传递axis=1给 apply 函数将函数应用于sizes数据帧的每一行,返回一个系列以添加到新的数据帧。该系列 s 包含新值以及原始数据。
axis=1
sizes
def sizes(s): s['size_kb'] = locale.format("%.1f", s['size'] / 1024.0, grouping=True) + ' KB' s['size_mb'] = locale.format("%.1f", s['size'] / 1024.0 ** 2, grouping=True) + ' MB' s['size_gb'] = locale.format("%.1f", s['size'] / 1024.0 ** 3, grouping=True) + ' GB' return s df_test = df_test.append(rows_list) df_test = df_test.apply(sizes, axis=1)