gpt4 book ai didi

python - Oneliner 从多个列创建字符串列

转载 作者:行者123 更新时间:2023-12-01 02:33:25 26 4
gpt4 key购买 nike

考虑以下代码

import pandas as pd
df = pd.DataFrame({'col_1' : [1, 2, 3, 4],\
'col_2' : ['a', 'b', 'c', 'd'],\
'col_3' : ['hey', 'ho', 'banana', 'go']})

col = df['col_1'].astype(str) + '_' + \
df['col_2'].astype(str) + '_' + \
df['col_3'].astype(str)

col
Out[12]:
0 1_a_hey
1 2_b_ho
2 3_c_banana
3 4_d_go
dtype: object

有人能想到使用数组 col_names = ['col_1', 'col_2', 'col_3'] 作为输入来生成 col 的 oneliner 吗?

col_sum = Something_smart(col_names)

显然,例如, different_col_set = ['col_2', 'col_3']

something_smart(different_col_set)
Out[13]:
0 a_hey
1 b_ho
2 c_banana
3 d_go
dtype: object

重点是 col_names 是一个包含数据帧列名的任何子集的数组。

最佳答案

选项 1] 使用apply,您可以'_'.join

In [5521]: df[col_names].astype(str).apply('_'.join, axis=1)
Out[5521]:
0 1_a_hey
1 2_b_ho
2 3_c_banana
3 4_d_go
dtype: object

并且,

In [5523]: df[different_col_set].astype(str).apply('_'.join, axis=1)
Out[5523]:
0 a_hey
1 b_ho
2 c_banana
3 d_go
dtype: object

选项 2] 在这种情况下,使用 reduce 比 apply 更快。

In [5527]: reduce(lambda x, y: x + '_' + y, [df[c].astype(str) for c in col_names])
Out[5527]:
0 1_a_hey
1 2_b_ho
2 3_c_banana
3 4_d_go
dtype: object

In [5528]: reduce(lambda x, y: x + '_' + y, [df[c].astype(str) for c in different_col_set])
Out[5528]:
0 a_hey
1 b_ho
2 c_banana
3 d_go
dtype: object

这类似于reduce(lambda x, y: x.astype(str) + '_' +y.astype(str), [df[x] for x in col_names])

<小时/>

时间安排

In [5556]: df.shape
Out[5556]: (10000, 3)

In [5553]: %timeit reduce(lambda x, y: x + '_' + y, [df[c].astype(str) for c in col_names])
10 loops, best of 3: 21.7 ms per loop

In [5554]: %timeit reduce(lambda x, y: x.astype(str) + '_' +y.astype(str), [df[x] for x in col_names])
10 loops, best of 3: 22.3 ms per loop

In [5555]: %timeit df[col_names].astype(str).apply('_'.join, axis=1)
1 loop, best of 3: 254 ms per loop

关于python - Oneliner 从多个列创建字符串列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46514967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com