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/