python - 如果字段包含特定列中的值,则将字段移动到新列

标签 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

我有一个文件,我需要在新列中添加一些字段,以便我能够将所需的字段放入新行中,但我无法将第 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

请告知实现此目的的最佳方法。谢谢。

最佳答案

这是一种方法:

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

关于python - 如果字段包含特定列中的值,则将字段移动到新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51656948/

相关文章:

c# - 如何使用 VSTO 2010 for Excel 按名称显示工作表

Python/Numpy/Scipy - 将字符串转换为数学函数

python - 在 Python 函数中引用(而不是赋值)全局变量。做法不好还是不好?

python - Pygame 在 blitting 期间返回锁定错误

Python Docx Lib - 打开 Word

excel - Spark(Scala)解析时间戳格式为 ("dd-MMM-yy hh:mm:ss:SSSSSSSSS aa"的字段的问题)

vba - 动态范围和一个静态项目通过 VBA 到 ComboBox

Python 创建数据并将其附加到新的 Excel 工作簿 pandas

python - pandas str 拆分并应用,创建多索引 df

python - 如何使用 python 找到最常见的集合?