gpt4 book ai didi

python - 解除(爆炸)Pandas 系列

转载 作者:太空宇宙 更新时间:2023-11-03 21:12:47 25 4
gpt4 key购买 nike

我有:

df = pd.DataFrame({'col1': ['asdf', 'xy', 'q'], 'col2': [1, 2, 3]})

col1 col2
0 asdf 1
1 xy 2
2 q 3

我想从 col1 中的字符串中获取每个字母的“组合积”,以及 col2 中的每个元素整数。即:

  col1  col2
0 a 1
1 s 1
2 d 1
3 f 1
4 x 2
5 y 2
6 q 3

当前方法:

from itertools import product

pieces = []
for _, s in df.iterrows():
letters = list(s.col1)
prods = list(product(letters, [s.col2]))
pieces.append(pd.DataFrame(prods))

pd.concat(pieces)

还有更有效的解决方法吗?

最佳答案

使用list + str.joinnp.repeat -

pd.DataFrame(
{
'col1' : list(''.join(df.col1)),
'col2' : df.col2.values.repeat(df.col1.str.len(), axis=0)
})

col1 col2
0 a 1
1 s 1
2 d 1
3 f 1
4 x 2
5 y 2
6 q 3
<小时/>

可以轻松实现任意数量的列的通用解决方案,无需对解决方案进行太多更改 -

i = list(''.join(df.col1))
j = df.drop('col1', 1).values.repeat(df.col1.str.len(), axis=0)

df = pd.DataFrame(j, columns=df.columns.difference(['col1']))
df.insert(0, 'col1', i)

df

col1 col2
0 a 1
1 s 1
2 d 1
3 f 1
4 x 2
5 y 2
6 q 3
<小时/>

性能

df = pd.concat([df] * 100000, ignore_index=True)

# MaxU's solution

%%timeit
df.col1.str.extractall(r'(.)') \
.reset_index(level=1, drop=True) \
.join(df['col2']) \
.reset_index(drop=True)

1 loop, best of 3: 1.98 s per loop

# piRSquared's solution

%%timeit
pd.DataFrame(
[[x] + b for a, *b in df.values for x in a],
columns=df.columns
)

1 loop, best of 3: 1.68 s per loop

# Wen's solution

%%timeit
v = df.col1.apply(list)
pd.DataFrame({'col1':np.concatenate(v.values),'col2':df.col2.repeat(v.apply(len))})

1 loop, best of 3: 835 ms per loop

# Alexander's solution

%%timeit
pd.DataFrame([(letter, i)
for letters, i in zip(df['col1'], df['col2'])
for letter in letters],
columns=df.columns)

1 loop, best of 3: 316 ms per loop

%%timeit
pd.DataFrame(
{
'col1' : list(''.join(df.col1)),
'col2' : df.col2.values.repeat(df.col1.str.len(), axis=0)
})

10 loops, best of 3: 124 ms per loop

我尝试对 Vaishali 进行计时,但在该数据集上花费的时间太长。

关于python - 解除(爆炸)Pandas 系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54933754/

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