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

时间:2018-08-02 15:10:02

标签: python excel pandas csv

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

我有一个文件,我需要在新列中添加一些字段,因此我可以将想要的字段放在新行中,但是我无法将LINE 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

请提供最佳方法建议。谢谢。

1 个答案:

答案 0 :(得分:1)

这是一种方法:

www.example.com/foo

完整示例:

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] 的所有行,而这样做的一种方法是利用我们得到LINE列的事实。通过选择值为TXOBJECT == "*"的行并应用cumsum(),我们可以将行分组。从这里开始twp操作:获取txlines值,然后获取每个组的第一行并重组您的数据。

通过使用1可以得到:

txl = g['TXNAME'].apply(lambda x: ' '.join(x[1:])).values

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

   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