Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何通过字符串连接将每个字符串拆分成新行_Python_Pandas_Split - Fatal编程技术网

Python:如何通过字符串连接将每个字符串拆分成新行

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

这是我的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   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,没有 爆炸功能

好的,让我们尝试一些string
split
/
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