Панды: Как восстановить строки из слова в строке - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблема с восстановлением предложений в большом фрейме данных Pandas (1 500 000 строк).Моя цель состоит в том, чтобы преобразовать предложения из слов в новый фрейм данных, чтобы в каждой строке было одно предложение.У меня есть две серии в моем DataFrame: слова и теги.Каждое предложение отделяется восклицательным знаком.Кроме того, я хочу создать две отдельные серии в новом DataFrame для прилагательных и существительных / глаголов, используя теги в оригинальном DataFrame.Итак, вот что у меня есть:

>df

word    tag

bike    NOUN
winner  NOUN
!       PUNCTUATION
red     ADJECTIVE
car     NOUN
is      VERB
fast    ADJECTIVE
!       PUNCTUATION
...     ...

и вот что я хотел бы иметь

>df2

sent             nounverb     adj

bike winner      bike winner  None
red car is fast  car is       red fast
...

Я не смог найти решение для этого, и, как яБудучи новичком в Python, я не смог придумать for loop, который бы сделал это для меня.

РЕДАКТИРОВАТЬ:

Спасибо Andy & Jesús за ваши быстрые ответы,Ответ Энди сработал аккуратно, хотя при создании нового DataFrame с моей стороны требовалась небольшая модификация.Нужно было называть слова как строки.

df2 = pd.DataFrame({
          "sent": g.apply(lambda sdf: " ".join(sdf.word.astype(str))),
          "nounverb": g.apply(lambda sdf: " ".join(sdf[sdf.is_nounverb].word.astype(str))),
          "adj": g.apply(lambda sdf: " ".join(sdf[sdf.tag == "ADJECTIVE"].word.astype(str)))
  })

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Если вы добавляете фиктивный столбец для «nounverb», вы можете использовать обычный ol 'groupby:

In [11]: df["is_nounverb"] = (df.tag == "NOUN") | (df.tag == "VERB")

Затем вы можете сосчитать !, который вы видели, чтобы перечислить предложения:

In [12]: df["sentence"] = (df.word == "!").cumsum()

In [13]: df = df[df.word != "!"]

In [14]: df
Out[14]:
     word        tag  sentence  is_nounverb
0    bike       NOUN         0         True
1  winner       NOUN         0         True
3     red  ADJECTIVE         1        False
4     car       NOUN         1         True
5      is       VERB         1         True
6    fast  ADJECTIVE         1        False

И сгруппировать это:

In [15]: g = df.groupby("sentence")

In [16]: g.apply(lambda sdf: " ".join(sdf.word))
Out[16]:
sentence
0        bike winner
1    red car is fast
dtype: object

In [17]: g.apply(lambda sdf: " ".join(sdf[sdf.is_nounverb].word))
Out[17]:
sentence
0    bike winner
1         car is
dtype: object

In [18]: g.apply(lambda sdf: " ".join(sdf[sdf.tag == "ADJECTIVE"].word))
Out[18]:
sentence
0
1    red fast
dtype: object

И вместе:

In [21]: df2 = pd.DataFrame({
              "sent": g.apply(lambda sdf: " ".join(sdf.word)),
              "nounverb": g.apply(lambda sdf: " ".join(sdf[sdf.is_nounverb].word)),
              "adj": g.apply(lambda sdf: " ".join(sdf[sdf.tag == "ADJECTIVE"].word))
      })

In [22]: df2
Out[22]:
               adj     nounverb             sent
sentence
0                   bike winner      bike winner
1         red fast       car is  red car is fast
0 голосов
/ 25 апреля 2018

Решение проходит через первый столбец в кадре данных и собирает список предложений. Вы можете сделать это с условием цикла, в котором вы, например, пропускаете пунктуацию. Затем для каждого из этих временных слов, которые вы собираете в предложения, вы должны собрать описание (при условии, что между ними есть соотношение 1: 1).

Я привел небольшой пример, который не полностью функционален, но он должен указать вам правильное направление.

a = ['bike', 'winner', '!', 'red', 'car', 'is', 'fast', '!']
b = ['noun', 'noun', 'punctuation', 'adjective', 'noun', 'verb', 'adjective', 'punctuation']

temp_word = ''
temp_nounverb = ''
temp_adjective = ''
for index,word in enumerate(a):
    if word is not '!':
        temp_word += word + ' '
        if b[index] is 'noun' or b[index] is 'verb':
            temp_nounverb += word + ' '
            temp_adjective += 'None'
        else:
            temp_nounverb += 'None'
            temp_adjective += word + ' '
    else:
        print(temp_word + ' - ' + temp_nounverb + ' - ' + temp_adjective)
        temp_word = ''
        temp_nounverb = ''
        temp_adjective = ''

Дайте мне знать, если вам понадобятся дополнительные указания, и я буду рад помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...