我有:
df = pd.DataFrame({'col1': ['asdf', 'xy', 'q'], 'col2': [1, 2, 3]})
col1 col2
0 asdf 1
1 xy 2
2 q 3
我想从in中的字符串中提取每个字母的“组合乘积”,并将in中的col1
每个elementwise int提取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.join
和np.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进行计时,但是在此数据集上花费的时间太长。
描述 (Description) 我们可以通过为属性data-equalizer提供唯一ID来将均衡器嵌套在另一个中。 data-equalizer-watch值应与其父值匹配。 例子 (Example) 以下示例演示了在Foundation中使用嵌套均衡器 - <!DOCTYPE html> <html> <head> <title>Foundation Template</t
描述 (Description) 我们可以将网格列嵌入列中。 在一列中,我们可以在其中定义更多列。 例子 (Example) 以下示例演示了在Foundation中使用nesting - <!DOCTYPE html> <html> <head> <title>Foundation Template</title> <meta name = "viewport" co
像爆炸一样的凸版印刷。这是 UIView 名为 explode 的分类
描述 (Description) 你可以在另一个模态中使用一个模态。 例子 (Example) 以下示例演示了在Framework7中使用嵌套模式,它在其他模态中提供模态 - <!DOCTYPE html> <html> <head> <meta name = "viewport" content = "width = device-width, initial-scale =
Syntax In Sass, nesting CSS rules allows to define hierarchy selectors: .title{ strong{} em{} } This will be compiled into: .title{} .title strong{} .title em{} Because strong and em appear within
描述 (Description) &可以在逗号分隔的列表中生成所有可能的选择器排列。 例子 (Example) 以下示例演示了如何使用&生成LESS文件中所有可能的选择器排列 - <html> <head> <link rel = "stylesheet" href = "style.css" type = "text/css" /> <title>Combinato