Добавление нового столбца с условием - PullRequest
1 голос
/ 03 апреля 2020

Мне нужно было бы управлять фреймом данных, добавляя больше столбцов. Моя выборка заголовков данных:

`Date` `Sentence` 
28 Jan      who.c   
30 Jan      house.a
02 Feb      eurolet.it

Мне нужно добавить еще один столбец, Tp, для которого каждой ссылке присваивается значение:

  • , если предложение заканчивается на a затем присваивают apartment; если оно заканчивается на b, тогда присвойте bungalow и т. д., как показано в original;
  • , если предложение заканчивается на UK, тогда присвойте United Kingdom; если он заканчивается на IT, тогда присваивайте Italy и так далее. Значения от country. Я бы ожидал что-то вроде этого:

    Дата Приговор Tp 28 января, кто. c церковь 30 января house.a квартира 02 февраля eurolet.it. Италия

Я написал следующее:

conditions = [df['Sentence'].str.endswith(original), df['Sentence'].str.endswith(country)]
choices = [original, country]
# df['Tp'] = df.apply(lambda row: urlparse(row['Sentence']).netloc, axis = 1)
df['Tp'] = np.select(conditions, choices, default ='Unknown')
print(df)

, где

original= [('a', 'apartment'), ('b', 'bungalow'), ('c', 'church')]

и

country = [('UK', 'United Kingdom'), ('IT', 'Italy'), ('DE', 'Germany'), ('H', 'Holland'), ..., ('F', 'France'), ('S', 'Spain')]

country содержит более 50 элементов.

Не могли бы вы подсказать, как это исправить? Столбец должен быть добавлен во фрейм данных, затем в CSV-файл.

Спасибо

Обновление:

                      Sentences  \
    0                                      
    1                       who.c  
    2                  citta.me.it   
    3                    office.of
    4                   eurolet.eu   
    ..                               ...   
    995                    uilpa.ie   
    996                      fog.de

Original and country are from

list_country=np.array(country).tolist()
list_country_name=np.array(country_name).tolist()
flat_name_country = [item for sublist in list_country for item in sublist]
flat_country_name = [item for sublist in list_country_name for item in sublist] 

zip_domains=list(zip(flat_name_country, flat_country_name))

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Сначала давайте создадим несколько словарей из ваших кортежей и скомбинируем их

country = {k.lower() : v for (k,v) in country}
og = {k : v for (k,v) in original}
country.update(og)

print(country)

{'uk': 'United Kingdom',
 'it': 'Italy',
 'de': 'Germany',
 'h': 'Holland',
 'f': 'France',
 's': 'Spain',
 'a': 'apartment',
 'b': 'bungalow',
 'c': 'church'}

, затем разделим и получим элемент max - это позволяет игнорировать любые полные остановки в вашем тексте, только глядя на последний элемент наконец, мы используем .map, чтобы связать ваши значения.

df['value'] = df["Sentence"].str.split(".", expand=True).stack().reset_index(1).query(
    "level_1 == level_1.max()"
)[0].map(country)

print(df)

     Date    Sentence      value
0  28 Jan       who.c     church
1  30 Jan     house.a  apartment
2  02 Feb  eurolet.it      Italy
1 голос
/ 03 апреля 2020

Можете ли вы преобразовать свои original и country в dict?

original= [('a', 'apartment'), ('b', 'bungalow'), ('c', 'church')]
original = {x:y for x,y in original}
country = [('UK', 'United Kingdom'), ('IT', 'Italy'), ('DE', 'Germany'), ('H', 'Holland'), ..., ('F', 'France'), ('S', 'Spain')]
country = {x:y for x,y in country}

Теперь вы можете выполнить ту же задачу, что и:

df['Tp'] = df['Sentence'].apply(lambda sen : original.get( sen[-1], country.get(sen[-1], 'unknown') ) )

В вашем коде вам нужно чтобы длина элементов в conditions была такой же, как в choices (и, соответственно, оригинал и страна)

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