Pandas分割列并创建元组列

4

我有一个数据框,它看起来如下所示:

# df

colA     colB          colC

rqp      129            a   
pot      217;345        u
ghay     716            b
rbba     217;345        d
tary     612;811;760    a
kals     716            t

ColB(两个组件中的任意一个)和ColC的组合形成独特的组合。 我想从这个数据框中创建一个如下所示的数据框

# newdf:

colAA      coLBB      

(129,a)    (a,rqp)
(217,u)    (u,pot)
(345,u)    (u,pot)
(716,b)    (b,ghay)
(217,d)    (d,rbba)
(345,d)    (d,rbba)
(612,a)    (a,tary)
(811,a)    (a,tary)
(760,a)    (a,tary)
(716,t)    (t,kals)

我尝试创建新列,如果colB中只有一个元素,但无法使用分号分隔符进行操作,也不知道如何创建元组列。
如果ColB中没有使用任何分号,则可以使用以下代码:
df['AA'] = list(zip(df[colB], df[colC]))
df['AB'] = list(zip(df[colC], df[colA]))

然而,ColB 中出现的分号会导致问题,需要将该字符串拆分成多个部分并分配元组。非常感谢您的帮助。

请发布一些您已经尝试过的代码。 - EXODIA
感谢 Exodia 指出这一点。我已经添加了在 colB 中尝试过的没有分号的代码,它可以正常工作。但是,使用分号,我还没有成功。 - Stan
如果有更多由“;”分割的元素,您需要新列,还是您想要在同一列中具有多个元组? - EXODIA
3个回答

2
使用 Series.str.split 函数来将列colB中的字符串按分隔符;拆分,然后使用 DataFrame.explode 函数将列colB的每个元素转换为行,并复制索引值。最后使用 DataFrame.agg 函数沿着axis=1聚合所需的列为元组tuple
df['colB'] = df['colB'].str.split(';')
df = df.explode('colB')
df['ColAA'] = df[['colB', 'colC']].agg(tuple, axis=1)
df['ColBB'] = df[['colC', 'colA']].agg(tuple, axis=1)
df = df[['ColAA', 'ColBB']].reset_index(drop=True)

结果:

# print(df)
     ColAA      ColBB
0  (129, a)   (a, rqp)
1  (217, u)   (u, pot)
2  (345, u)   (u, pot)
3  (716, b)  (b, ghay)
4  (217, d)  (d, rbba)
5  (345, d)  (d, rbba)
6  (612, a)  (a, tary)
7  (811, a)  (a, tary)
8  (760, a)  (a, tary)
9  (716, t)  (t, kals)

1
太棒了。谢谢Shubham。我从你那里学到了一个新的explode方法!太好了! - Stan

0
你可以使用带有扩展参数的 str.split() 来拆分列表并基于拆分获取新列。
df['colB'].str.split(pat=';',expand=True)

在这里阅读更多内容


0

代码

def merge(row):
    return pd.Series({
            "colAA": (row.colB, row.colC),
            "colBB": (row.colC, row.colA),
        })

df['colB'] = df['colB'].str.split(';')
df = df.explode('colB')
newDf = df.apply(merge, axis=1).reset_index(drop=True)
说明

您可以使用 split 函数将 colB 拆分为值列表, 然后应用 explode 函数以获取多行数据。

df['colB'] = df['colB'].str.split(';')
df = df.explode('colB')

# output
    colA    colB    colC
0   rqp 129 a
1   pot 217 u
1   pot 345 u
2   ghay    716 b
3   rbba    217 d

然后应用下面的合并函数来创建新的数据框

def merge(row):
    for b in row.colB.split(";"):
         return pd.Series({
            "colAA": (b, row.colC),
            "colBB": (row.colC, row.colA),

        })

然后在Df上应用此函数

newDf = df.apply(merge, axis=1).reset_index(drop=True)

# output
    colAA        colBB
0   (129, a)    (a, rqp)
1   (217, u)    (u, pot)
2   (345, u)    (u, pot)
3   (716, b)    (b, ghay)
4   (217, d)    (d, rbba)
5   (345, d)    (d, rbba)
6   (612, a)    (a, tary)
7   (811, a)    (a, tary)
8   (760, a)    (a, tary)
9   (716, t)    (t, kals)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接