这是我的 df,它由 3 列组成。我大致知道如何使用 stack 和 unstack 将字符串拆分成一个新行。但是,我想知道在拆分字符串时如何保留“前缀”(可能并不总是相同的长度)。
编辑:目前我正在使用没有爆炸功能的 Pandas 版本 0.23.0。
之前:
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()
最佳答案
Edit: Currently I am working with the Pandas version 0.23.0 without the explode function.
好的,让我们尝试一些字符串 split
/join
并使用 melt
,它是在 pandas 版本 0.20
中引入的,所以这个解决方案应该适合你。
result = (
df[['Col1', 'Col3']].join(
df['Col2'].str.split('-')
.apply(lambda x: ','.join(f'{x[0]}-{item}' for item in x[1].split('/')))
.str.split(',', expand=True))
.melt(id_vars=['Col1', 'Col3'], value_name='value')
.dropna()
.rename(columns={'value': 'Col2'})
.sort_values(by='Col3')
)[['Col1','Col2', 'Col3']]
解释:
不是在 /
上拆分字符串,而是在 -
上拆分它,然后将第一部分连接到第二部分(由 /
拆分),通过 ,
连接所有这些项目,最后在 ,
上调用 split with expand
as True
,它将为 n
值添加 n
列,然后调用 melt
,它将所有这些 n
值放在一个列中,最后删除所有空行,并按 Col3
对值进行排序,以使其与问题中的预期输出相匹配。
输出:
Col1 Col2 Col3
0 1 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
关于Python:如何通过一些字符串连接将每个字符串拆分为新行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67831093/