我有一个熊猫数据帧,df_test
。它包含一列“size”,以字节表示大小。我使用以下代码计算了KB、MB和GB:
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]
我已经运行了120000行,每列大约需要2.97秒*3=~9秒(根据%timeit)
有什么方法可以让这更快吗?例如,我可以在一次传递中返回所有三列以插入原始数据帧,而不是从apply一次返回一列并运行三次吗
我发现的其他问题都希望获取多个值并返回单个值。我想获取一个值并返回多个列
使用apply和zip的速度将是串行方式的3倍
测试结果如下:
当前的一些回复很好,但我想提供另一个,也许更“泛化”的选项。这适用于我当前的pandas 0.23(不确定它是否适用于以前的版本):
注意,技巧在于
apply
的result_type
参数,该参数将其结果扩展为可直接分配给新/旧列的DataFrame
您可以从应用函数返回包含新数据的序列,从而避免需要迭代三次。将
axis=1
传递给apply函数将函数sizes
应用于数据帧的每一行,返回要添加到新数据帧的序列。此系列s包含新值以及原始数据相关问题 更多 >
编程相关推荐