Python:如何通过字符串连接将每个字符串拆分成新行
这是我的df,由3列组成。我大致知道如何使用stack和unstack将字符串拆分成新行。但是,我想知道如何在拆分字符串时保留“前缀”(可能并不总是相同的长度) 编辑:目前我正在使用Pandas版本0.23.0,但没有explode功能 之前:Python:如何通过字符串连接将每个字符串拆分成新行,python,pandas,split,Python,Pandas,Split,这是我的df,由3列组成。我大致知道如何使用stack和unstack将字符串拆分成新行。但是,我想知道如何在拆分字符串时保留“前缀”(可能并不总是相同的长度) 编辑:目前我正在使用Pandas版本0.23.0,但没有explode功能 之前: Col1 Col2 Col3 1 QQ12345-01/02/03 x 2 QQ123456-01/02 y 3 QQ12345-01/02/03 z 之后: Col1 C
Col1 Col2 Col3
1 QQ12345-01/02/03 x
2 QQ123456-01/02 y
3 QQ12345-01/02/03 z
之后:
Col1 Col2 Col3
1 QQ12345-01 x
1 QQ12345-02 x
1 QQ12345-03 x
2 QQ123456-01 y
2 QQ123456-02 y
3 QQ12345-01 z
3 QQ12345-02 z
3 QQ12345-03 z
目前,我只能通过“/”进行拆分。下面是我的代码。我非常感谢你在这方面的帮助
column_list = df.loc[:,df.columns!='Col2'].columns.tolist()
df.set_index(column_list).stack().str.split('\',expand=True).stack().unstack(-2).reset_index(-1,drop=True).reset_index()
一种可能的解决方案是转换
Col2
,然后合并回df
:
outcome = (df.Col2.str.split("-", expand = True)
.set_axis(['col1', 'col2'], axis = 1)
.assign(col2 = lambda df: df.col2.str.split("/"))
.explode('col2')
.agg("-".join, axis = 1)
)
现在与原始数据帧重新组合,(熊猫将通过索引处理对齐):
由于您的版本不支持分解,另一个选项是在普通python中执行所有处理并重新创建数据帧。这也很有帮助,因为我们正在处理字符串,这在vanilla python中比Pandas更快(Pandas字符串不是固定宽度的,并且基于python的字符串模块):
将数据帧转储到numpy中:
from itertools import product, chain
dump = df.to_numpy()
dump
array([[1, 'QQ12345-01/02/03', 'x'],
[2, 'QQ123456-01/02', 'y'],
[3, 'QQ12345-01/02/03', 'z']], dtype=object)
在此处构建一系列提取:
step1 = [(first, second.split("-")[0],
second.split("-")[-1].split("/"),
last)
for first, second, last in dump]
step2 = [(first, product([second], third), last)
for first, second, third, last in step1]
step3 = [(first, map("-".join, second), last)
for first, second, last in step2]
step4 = [product([first], second, [last])
for first, second, last in step3]
step5 = chain.from_iterable(step4)
pd.DataFrame(step5, columns = df.columns)
Col1 Col2 Col3
0 1 QQ12345-01 x
1 1 QQ12345-02 x
2 1 QQ12345-03 x
3 2 QQ123456-01 y
4 2 QQ123456-02 y
5 3 QQ12345-01 z
6 3 QQ12345-02 z
7 3 QQ12345-03 z
但是,请注意,您丢失了Col1
和Col3
的数据类型;您可以执行aType
或convert\u dtypes
编辑:目前我正在使用熊猫版本0.23.0,没有
爆炸功能
好的,让我们尝试一些stringsplit
/join
并使用melt
,它是在pandas版本0.20
中引入的,所以这个解决方案应该适合您
结果=(
df[['Col1','Col3']]。加入(
df['Col2'].str.split('-')
.apply(lambda x:','.join(f'{x[0]}-{item}用于x[1]中的项)。拆分('/'))
.str.split(“,”,expand=True))
.melt(id_vars=['Col1','Col3'],value_name='value')
.dropna()
.rename(列={'value':'Col2'})
.sort_值(按class='Col3')
)[['Col1'、'Col2'、'Col3']]
说明:
不要在/
上拆分字符串,而是在-
上拆分字符串,然后将第一部分连接到第二部分(按/
拆分),将所有这些项按,
合并,最后在上调用拆分,
,使用展开为真,它将为n
值添加n
列,然后调用melt
,它将把所有这些n
值放在一列中,最后删除任何空行,并按Col3
对值进行排序,以便将其与问题中的预期输出相匹配
输出:
Col1 Col2 Col3
01 QQ12345-01 x
3 1 QQ12345-02 x
6 1 QQ12345-03 x
1 2 QQ123456-01 y
4.2 QQ123456-02 y
2 3 QQ12345-01 z
5.3 QQ12345-02 z
8.3 QQ12345-03 z
非常感谢,我将尝试使用stack和unstack,因为我当前的python版本没有explode函数。您使用的是什么版本?对不起,是pandas版本0.23.0
step1 = [(first, second.split("-")[0],
second.split("-")[-1].split("/"),
last)
for first, second, last in dump]
step2 = [(first, product([second], third), last)
for first, second, third, last in step1]
step3 = [(first, map("-".join, second), last)
for first, second, last in step2]
step4 = [product([first], second, [last])
for first, second, last in step3]
step5 = chain.from_iterable(step4)
pd.DataFrame(step5, columns = df.columns)
Col1 Col2 Col3
0 1 QQ12345-01 x
1 1 QQ12345-02 x
2 1 QQ12345-03 x
3 2 QQ123456-01 y
4 2 QQ123456-02 y
5 3 QQ12345-01 z
6 3 QQ12345-02 z
7 3 QQ12345-03 z