Панды: Как искать столбец для набора строк? - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть фрейм данных, содержащий столбец с твитами. Этот текст содержит так называемые «@» упоминания. Я хочу добавить новый столбец к этому фрейму данных, содержащий упоминание '@', найденное в этой строке. Код:

dfEx5.text.apply(str) #Convert all elements in the text-column to a string-type

dfEx5['mentions'] = pd.np.where(dfEx5.text.str.contains("@AmericanAir"), "@AmericanAir",
                    pd.np.where(dfEx5.text.str.contains("@JetBlue"), "@JetBlue",
                    pd.np.where(dfEx5.text.str.contains("@SouthwestAir"), "@SouthwestAir",
                    pd.np.where(dfEx5.text.str.contains("@united"), "@united",
                    pd.np.where(dfEx5.text.str.contains("@USAirways"), "@USAirways",
                    pd.np.where(dfEx5.text.str.contains("@VirginAmerica"), "@VirginAmerica",))))))

Сначала я преобразовал все элементы в строковый тип. Если столбец содержит «@AmericanAir», поместите «@AmericanAir» в столбец упоминания и т. Д.

Спасибо за помощь!

1 Ответ

0 голосов
/ 07 сентября 2018

pandas.Series.str.findall

Я бы нашел все упоминания в своей группе часов и взял бы первое.

df.text.str.findall('|'.join(watch)).str[0]

0      @AmericanAir
1          @JetBlue
2     @SouthwestAir
3           @united
4        @USAirways
5    @VirginAmerica
Name: text, dtype: object

Добавить его в новый столбец через assign

df.assign(mentions=df.text.str.findall('|'.join(watch)).str[0])

                    text        mentions
0  @AmericanAir @JetBlue    @AmericanAir
1               @JetBlue        @JetBlue
2          @SouthwestAir   @SouthwestAir
3  @united @SouthwestAir         @united
4             @USAirways      @USAirways
5         @VirginAmerica  @VirginAmerica

Вы можете оставить все упоминания, если хотите

df.assign(mentions=df.text.str.findall('|'.join(watch)))

                    text                  mentions
0  @AmericanAir @JetBlue  [@AmericanAir, @JetBlue]
1               @JetBlue                [@JetBlue]
2          @SouthwestAir           [@SouthwestAir]
3  @united @SouthwestAir  [@united, @SouthwestAir]
4             @USAirways              [@USAirways]
5         @VirginAmerica          [@VirginAmerica]

Настройка

watch = [
    '@SouthwestAir',
    '@VirginAmerica',
    '@united',
    '@JetBlue',
    '@USAirways',
    '@AmericanAir'
]
text = """\
@AmericanAir @JetBlue
@JetBlue
@SouthwestAir
@united @SouthwestAir
@USAirways
@VirginAmerica
"""
df = pd.DataFrame(dict(text=text.splitlines()))

df

                    text
0  @AmericanAir @JetBlue
1               @JetBlue
2          @SouthwestAir
3  @united @SouthwestAir
4             @USAirways
5         @VirginAmerica
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...