Объединить строку с предыдущей, если новая строка начинается с "|" труба в датафрейме - PullRequest
0 голосов
/ 15 января 2020

Учитывая приведенный ниже текстовый сценарий:

df = pd.read_csv('dummy.txt', sep='|')
        ID   Name           Email Country  Quantity
0  2.0  name2  name@email.com      UK       8.0
1  3.0  name3  name@email.com     NaN       NaN
2  NaN     UK               8     NaN       NaN
3  5.0  name4  name@email.com     NaN       NaN
4  NaN     UK               8     NaN       NaN
5  7.0  name5  name@email.com      UK       8.0

и необработанные данные:

ID|Name|Email|Country|Quantity
2|name2|name@email.com|UK|8
3|name3|name@email.com
|UK|8
5|name4|name@email.com
|UK|8
7|name5|name@email.com|UK|8

Таким образом, есть пунктирная линия с "|". Лог c должен быть: если строка начинается с «|» затем объединить с предыдущей строкой, к которой он принадлежит

Результат должен быть:

ID|Name|Email|Country|Quantity
2|name2|name@email.com|UK|8
3|name3|name@email.com|UK|8
5|name4|name@email.com|UK|8
7|name5|name@email.com|UK|8

Код Linux выполняет работу:

sed -z 's/\n|/|/g

Однако я не могу сделать это в Python.

1 Ответ

3 голосов
/ 15 января 2020

Использовать модуль re ( regex101 ):

txt = '''ID|Name|Email|Country|Quantity
2|name2|name@email.com|UK|8
3|name3|name@email.com
|UK|8
5|name4|name@email.com
|UK|8
7|name5|name@email.com|UK|8'''

import re

txt = re.sub(r'\n\|', '|', txt)
print(txt)

Печать:

ID|Name|Email|Country|Quantity
2|name2|name@email.com|UK|8
3|name3|name@email.com|UK|8
5|name4|name@email.com|UK|8
7|name5|name@email.com|UK|8

Загружать как pandas DataFrame:

df = pd.read_csv(StringIO(txt), sep='|')
print(df)

Отпечатки:

   ID   Name           Email Country  Quantity
0   2  name2  name@email.com      UK         8
1   3  name3  name@email.com      UK         8
2   5  name4  name@email.com      UK         8
3   7  name5  name@email.com      UK         8

РЕДАКТИРОВАТЬ: Для чтения из файла вы можете использовать:

import re
import sys
import pandas as pd

if sys.version_info[0] == 2:  # Not named on 2.6
    from StringIO import StringIO
else:
    from io import StringIO

with open('dummy.txt', 'r') as f_in:
    txt = f_in.read()

txt = re.sub(r'\n\|', '|', txt)

df = pd.read_csv(StringIO(txt), sep='|')

print(df)  # or 'print df' in Python2

Отпечатки:

   ID   Name           Email Country  Quantity
0   2  name2  name@email.com      UK         8
1   3  name3  name@email.com      UK         8
2   5  name4  name@email.com      UK         8
3   7  name5  name@email.com      UK         8
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...