Как я могу соединить определенные строки в кадре данных Pandas? - PullRequest
1 голос
/ 02 ноября 2019

Я хотел бы соединить определенные строки в кадре данных Pandas.

У меня есть столбец «текст» и другой столбец «имя». Каждая запись в столбце «текст» имеет строку. Некоторые записи в столбце «имя» пусты, поэтому я бы хотел соединить строку n, которая имеет пустую запись в столбце «имя», со строкой (n-1). Если в строке (n-1) также есть пустая запись в столбце «имя», строки должны соединиться как со следующей строкой, в которой есть запись в столбце «имя».

Например:
Ввод:

Text=["Abc","def","ghi","jkl","mno","pqr","stu"]

Name=["a","b","c",““,““,"f","g"]

Ожидаемый результат:

Text= ["Abc","def","ghijklmno","pqr","stu"]

Name = ["a","b","c","f","g"]

Я хотел бы сделать мой вопрос более понятным:

У меня есть два списка:

index = [3,6,8,9,10,12,15,17,18,19]
text = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
new = []
for i in range(0,len(text)):
    if i not in index:
        if i+1 not in index:
            new.append(text[i])
    if i in index:
        new.append(text[i-1]+' '+ text[i])

Индекс списка показывает ложные разбиения текста (когда имя столбца не имеет значения). Поэтому я хотел бы добавить, например, текст [3] к тексту [2]. Поэтому я получу новую запись 'c d'.

Наконец, вывод должен быть следующим:

new = ['a','b,'c d','e','f g','hijk','lm','n','op','qrst','u','v','w','x','y','z']

Эти списки являются лишь упрощенным примером для моего большого текстового списка. Я не знаю, сколько записей мне нужно соединить вместе. Мой алгоритм работает только тогда, когда мне нужно связать запись n с записью n-1. Но также возможно, что мне нужно связать запись n с записями до n-10, поэтому я получаю одну большую запись.

Надеюсь, мой вопрос теперь более понятен.

Ответы [ 3 ]

1 голос
/ 02 ноября 2019

Замените пустые строки на NaN и прямую заливку. Затем groupby Имя столбца и совокупности.

import pandas as pd

df.Name = df.Name.str.replace('', pd.np.nan).ffill()
out_df = df.groupby('Name').agg({'Text': ' '.join})
0 голосов
/ 03 ноября 2019

Теперь у меня есть решение (код выглядит не очень хорошо, но вывод - то, что я ожидал):

for i in range(0,len(text)):
    if i not in index:
        if i+1 not in index:
            new.append(text[i])
        elif i+1 in index:
            if i+2 not in index:
                new.append(text[i]+text[i+1])
            elif i+2 in index:
                if i+3 not in index:
                    new.append(text[i]+text[i+1]+text[i+2])
                elif i+3 in index:
                    if i+4 not in index:
                        new.append(text[i]+text[i+1]+text[i+2]+text[i+3])
                    elif i+4 in index:
                        if i+5 not in index:
                            new.append(text[i]+text[i+1]+text[i+2]+text[i+3]+text[i+4])

Я должен добавить еще несколько условий, если ... но дляупрощенный пример выше, код работает отлично.

0 голосов
/ 02 ноября 2019

с помощью defaultdict

   Name=["a","b","c",None,None,None,"f","g"]
    Text=["Abc","def","ghi","jkl","mno","pqr","stu"] 

    lst=list(zip(Name,Text))

    from collections import defaultdict 

    d=defaultdict(str) 


    for i, v in lst:
        d[i] += v

    print(list(d.values()))
['Abc', 'def', 'ghi', 'jklmnopqr', 'stu']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...