使用python合并2行中的值

时间:2018-10-22 03:06:13

标签: python data-processing

我在excel中有一个二维数组数据,如下所示:

01-Jan-1990 0:00:01 A abcdefghi jklmnopq
01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqq
01-Jan-1990 0:00:02   xwwwww xxxxxxx yyyy
01-Jan-1990 0:00:05 B qwerty qwerty
01-Jan 1990 0:00:06 C popopop qwqwqwq tytytyty sss

和数据中

[['01-Jan-1990 0:00:01','A','abcdefghi jklmnopq'],
 ['01-Jan-1990 0:00:02','A','abcdefghi xxxyyyvvv fefwwe qqqqq'],
 ['01-Jan-1990 0:00:02','\t','xwwwww xxxxxxx yyyy'],      #\t instead of empty
 ['01-Jan-1990 0:00:05','B','qwerty qwerty'],
 ['01-Jan 1990 0:00:06','C','popopop qwqwqwq tytytyty sss']]

是否想问我是否可以将第3行中的值组合到第2行中没有A,B,C的字符串中?

所需的输出如下:

01-Jan-1990 0:00:01 A abcdefghi jklmnopq
01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqq xwwwww xxxxxxx yyyy
01-Jan-1990 0:00:05 B qwerty qwerty
01-Jan 1990 0:00:06 C popopop qwqwqwq tytytyty sss

编辑了所需的输出且缺少字段

4 个答案:

答案 0 :(得分:1)

假设您的数据存储在变量data中,则可以使用itertools.groupby将子列表按其第一项分组,然后使用str.join将每个组的最后一项与空格:

from itertools import groupby
from operator import itemgetter
[[*l[0][:-1], ' '.join(m for *_, m in l)] for k, g in groupby(data, key=itemgetter(0)) for l in (list(g),)]

这将返回:

[['01-Jan-1990 0:00:01', 'A', 'abcdefghi jklmnopq'],
 ['01-Jan-1990 0:00:02', 'A', 'abcdefghi xxxyyyvvv fefwwe qqqqq xwwwww xxxxxxx yyyy'],
 ['01-Jan-1990 0:00:05', 'B', 'qwerty qwerty'],
 ['01-Jan 1990 0:00:06', 'C', 'popopop qwqwqwq tytytyty sss']]

答案 1 :(得分:0)

由于您要更改列表(通过删除元素),因此除非您保留要删除的运行索引列表,然后再执行此操作(或构造一个单独的列表,否则用for row in rows进行迭代将不起作用。您要避免更改原图等)。从len(rows) - 1开始到1倒退,这意味着您只需检查rows[i],并在必要时将其值附加到rows[i-1]的值即可:

rows = [
    ['01-Jan-1990 0:00:01','A','abcdefghi jklmnopq'],
    ['01-Jan-1990 0:00:02','A','abcdefghi xxxyyyvvv fefwwe qqqqq'],
    ['01-Jan-1990 0:00:02', '','xwwwww xxxxxxx yyyy'],
    ['01-Jan-1990 0:00:05','B','qwerty qwerty'],
    ['01-Jan 1990 0:00:06','C','popopop qwqwqwq tytytyty sss'],
]

for i in range(len(rows) - 1, 0, -1):
    if not rows[i][1]:
        rows[i-1][2] += rows[i][2]
        del rows[i]

print("\n".join(" ".join(e for e in row) for row in rows))
# 01-Jan-1990 0:00:01 A abcdefghi jklmnopq
# 01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqqxwwwww xxxxxxx yyyy
# 01-Jan-1990 0:00:05 B qwerty qwerty
# 01-Jan 1990 0:00:06 C popopop qwqwqwq tytytyty sss

这假设rows[0]永远不会有缺失值,这在您的问题中似乎很有意义。

答案 2 :(得分:0)

blhsing的解决方案很棒,但是假设您有类似的数据

01-Jan-1990 0:00:02 A abcdefghi xxxyyyvvv fefwwe qqqqq
01-Jan-1990 0:00:03 \t xwwwww xxxxxxx yyyy

该操作无效,因为需要花费[0](时间)进行分组。

因此,我提供了一种不使用时间的方法。

[[*x[:-1], x[2] + ' ' + data[i+1][2] if (data[i+1][1] == '\t' if i < len(data)-1 else False) else x[2] ] for i, x in enumerate(data) if x[1] != '\t']

答案 3 :(得分:-1)

以下是带有注释的可消化解决方案:)

EMPTY_MARKER = '\t'
LABEL_INDEX, VALUES_INDEX = 1, 2

# first pass to append rows with empty labels to previous row
for row in range(len(data) - 1):
    if data[row + 1][LABEL_INDEX] == EMPTY_MARKER:
        data[row][VALUES_INDEX] += ' {}'.format(data[row + 1][VALUES_INDEX])

# second pass to remove empty label rows
for row in data:
    if row[LABEL_INDEX] == EMPTY_MARKER:
        data.remove(row)

# visually readable way to display output :)
for row in data:
    print row

输出:

['01-Jan-1990 0:00:01', 'A', 'abcdefghi jklmnopq']
['01-Jan-1990 0:00:02', 'A', 'abcdefghi xxxyyyvvv fefwwe qqqqq xwwwww xxxxxxx yyyy']
['01-Jan-1990 0:00:05', 'B', 'qwerty qwerty']
['01-Jan 1990 0:00:06', 'C', 'popopop qwqwqwq tytytyty sss']