如果字段在某一列中包含值,则将其移动到新列

2024-10-06 12:09:25 发布

您现在位置:Python中文网/ 问答频道 /正文

LINE    TXOBJECT    TXNAME  TXID    LANG TXLINES
1       KNMT         1234   0001     EN
2         *          MEA
2         *          MEB
2         *          MEB
1       KNMT        12345   0001     EN
2         *          MEN
2         *          MED
2         *          MEC
1       KNMT        123456  0001     EN
2         *          LADY
2         *          BOY
2         *          DUDE

我有一个文件,我得到了,我需要在一个新的列中的一些字段,所以我可以把我想要的字段在一个新行,但我不能把第2行的TXNAME列到TXLINES列

我不知道我对我想要什么的解释是否正确,但我会在下面解释我需要什么

我要这个在下面

LINE    TXOBJECT    TXNAME  TXID    LANG TXLINES
1       KNMT         1234   0001     EN  MEA MEB MEB
1       KNMT        12345   0001     EN  MEN MED MEC
1       KNMT        123456  0001     EN  LADY BOY DUDE

请建议最好的方法。谢谢


Tags: langlinemedenboymeatxidmen
1条回答
网友
1楼 · 发布于 2024-10-06 12:09:25

有一种方法:

g = df.groupby((df.LINE == 1).cumsum())
txl = g['TXNAME'].apply(lambda x: x[1:].values).values
df = g.head(1).assign(TXLINES=txl).reset_index(drop=True)

完整示例:

import pandas as pd
import numpy as np

data = '''\
LINE    TXOBJECT    TXNAME  TXID    LANG TXLINES
1       KNMT         1234   0001     EN
2         *          MEA
2         *          MEB
2         *          MEB
1       KNMT        12345   0001     EN
2         *          MEN
2         *          MED
2         *          MEC
1       KNMT        123456  0001     EN
2         *          LADY
2         *          BOY
2         *          DUDE'''

fileobj = pd.compat.StringIO(data)
df = pd.read_csv(fileobj, sep='\s+').fillna('')

# Restructure
g = df.groupby((df.LINE == 1).cumsum())
txl = g['TXNAME'].apply(lambda x: x[1:].values).values
df = g.head(1).assign(TXLINES=txl).reset_index(drop=True)

print(df)

退货:

   LINE TXOBJECT  TXNAME TXID LANG            TXLINES
0     1     KNMT    1234    1   EN    [MEA, MEB, MEB]
1     1     KNMT   12345    1   EN    [MEN, MED, MEC]
2     1     KNMT  123456    1   EN  [LADY, BOY, DUDE]

解释:

这里的目的是捕获所有TXOBJECT == "*"行,其中一种方法是使用我们得到一个LINE列的事实。通过挑选值为1的行并应用cumsum()我们可以将这些行分组。从这里我们执行twp操作:获取txlines值,然后我们获取每个组的第一行并重新构造数据

通过使用txl = g['TXNAME'].apply(lambda x: ' '.join(x[1:])).values,您可以得到:

   LINE TXOBJECT  TXNAME TXID LANG        TXLINES
0     1     KNMT    1234    1   EN    MEA MEB MEB
1     1     KNMT   12345    1   EN    MEN MED MEC
2     1     KNMT  123456    1   EN  LADY BOY DUDE

如果更清楚的话,您还可以将txl=更改为:

txl = g['TXNAME'].apply(list).str[1:].values

相关问题 更多 >