从pandas apply()返回多列。

我有一个pandas DataFrame。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]

我已经运行了12万行,根据%timeit,每列需要2. 97秒*3=约9秒。

有什么办法可以让这个过程更快吗? 例如,我可以不从apply一次返回一列并运行3次,而是一次返回所有三列并插入到原始数据框架中吗?

我找到的其他问题都是想要 取多个值并返回一个值. 我想… 取单列值并返回多列.

解决方案:

这是一个老问题,但为了完整起见,你可以从应用的函数中返回一个包含新数据的Series,以防止需要迭代三次。 传递 axis=1 的应用函数应用该函数 sizes 到数据框架的每一行,返回一个系列,添加到一个新的数据框架。 这个系列,s,包含新的值,以及原始数据。

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)

给TA打赏
共{{data.count}}人
人已打赏
解决方案

ElasticSearch - 嵌套查询返回的数据过滤

2022-4-22 8:00:12

解决方案

在node.js的Request中调用 "Request "范围外的变量。

2022-4-22 8:00:14

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索