Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 08.07.2011
Сообщений: 50

Заполнить пустые значения столбца, найдя подходящие для этого значения в подстроках другого столбца

03.09.2022, 01:18. Показов 2120. Ответов 6

Студворк — интернет-сервис помощи студентам
Приветствую, форумчане !

Начал изучать интенсивно Питон и уже в голове возникла каша. Прошу о помощи.
Есть Dataframe следующей структуры
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16713 entries, 0 to 16714
Data columns (total 12 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   name          16711 non-null  object 
 1   platform      16713 non-null  object 
 2   year          16444 non-null  float64
 3   genre         16711 non-null  object 
 4   na            16713 non-null  float64
 5   eu            16713 non-null  float64
 6   jp            16713 non-null  float64
 7   other         16713 non-null  float64
 8   critic_score  8137 non-null   float64
 9   user_score    7590 non-null   float64
 10  esrb          16713 non-null  object 
 11  game_total    16713 non-null  float64
dtypes: float64(8), object(4)
memory usage: 1.7+ MB
Некоторые значения столбца year пусты. Однако в некоторых значения столбца name указан год выпуска игры в самом названии.
Например:
 nameplatformyeargenrenaeujpothercritic_scoreuser_scoreesrbgame_total
475wwe Smackdown vs. Raw 2006PS2NaNFighting1.571.020.00.41NaNNaN 3.0
3929Sega Rally 2006PS2NaNRacing0.000.000.040.00NaNNaN 0.04
2572PES 2009: Pro Evolution SoccerPSPNaNSports0.040.330.260.17NaNNaN 0.8
Для пустых значений столбца year мне нужно из столбца name вычленить год, если он имеется в названии игры, и записать его в столбец year.
 nameplatformyeargenrenaeujpothercritic_scoreuser_scoreesrbgame_total
475wwe Smackdown vs. Raw 2006PS22006Fighting1.571.020.00.41NaNNaN 3.0

Далее того, чтобы выделить отдельный список, содержащий notnull значения года и перевести его элементы в строковые для поиска в name значений подстрок не продвинулся. Пытался использовать конструкцию df.name.str.contsins(), не получилось, пытался "по-деревенски" завести цикл по столбцам и строкам через iloc, тоже тупик.
Python
1
a=list(map(str,df.year.dropna().unique()))
Если вкратце, то для пустых значений колонки year нужно отыскать наличие уникальных значений year в строковом столбце name и записать эти значения в колонку year.

Благодарю за помощь
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.09.2022, 01:18
Ответы с готовыми решениями:

Excel найти уникальные значения из первого столбца и фильтровать - не брать пустые значения из 3 столбца
Ребят, помогите осуществить в коде VB в Excel. Сделал в самом доке, а как в коде на VB новичок. Нужно найти уникальные записи из первого...

проверить одинаковые значения ячеек столбца при условии что их значения другого столбца одинаковы
проверить одинаковые значения ячеек столбца при условии что их значения другого столбца одинаковы, а конкретно: &quot;Проверить, что в...

Как организовать ограничения на значения столбца таблицы, зависимые от значения другого столбца?
Допустим есть таблица со (прости Дейт) столбцами ID, Name, Type, SubType Причем, для каждого значения столбца типов Type существует свой...

6
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
03.09.2022, 05:09
Лучший ответ Сообщение было отмечено Catstail как решение

Решение

Подойдет?:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import pandas as pd 
import numpy as np 
import re
 
 
def fun(stri):
    if stri is not None:
        for elem in stri.split():
            if elem.isnumeric():
                e = int(elem)
                if 1957 < e < 2023:
                    return e
    return np.nan
    
 
df = pd.DataFrame({'name': ['a 2001', 'b', 'c 2005', None, 'd'], 
                   'year': [2006, 2004, np.nan, np.nan, np.nan]})
print(df, '\n')
 
df['year'] = df['year'].fillna(df['name'].map(fun))
print(df)
Можно и через regex, но там может быть много вариантов...
3
1 / 1 / 0
Регистрация: 08.07.2011
Сообщений: 50
03.09.2022, 17:05  [ТС]
Благодарю за ответ, НО:

а) Не могу согласиться с корректностью решения:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import re
 
def fun(stri):
    if stri is not None:
        for elem in stri.split():
            if elem.isnumeric():
                e = int(elem)
                if 1957 < e < 2023:
                    return e
    return np.nan
 
gf = pd.DataFrame({'name': ['a 2001', 'b', 'c 2005', None, 'd'], 
                   'year': [2006, 2004, np.nan, np.nan, np.nan]})
print(gf, '\n')
 
gf['year'] = gf['year'].fillna(gf['name'].map(fun))
gf
Ответ получается
Code
1
2
3
4
5
6
name    year
0  a 2001  2006.0
1       b  2004.0
2  c 2005     NaN
3    None     NaN
4       d     NaN
А Должен быть
Code
1
2
3
4
5
6
name    year
0  a 2001  2006.0
1       b  2004.0
2  c 2005     2005
3    None     NaN
4       d     NaN
б) При подстановке в мой df пишет ошибку
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
AttributeError                            Traceback (most recent call last)
Input In [21], in <cell line: 15>()
     11                     return e
     12     return np.nan
---> 15 df['year'] = df['year'].fillna(df['name'].map(fun))
     16 df
 
File ~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/series.py:4237, in Series.map(self, arg, na_action)
   4162 def map(self, arg, na_action=None) -> Series:
   4163     """
   4164     Map values of Series according to an input mapping or function.
   4165 
   (...)
   4235     dtype: object
   4236     """
-> 4237     new_values = self._map_values(arg, na_action=na_action)
   4238     return self._constructor(new_values, index=self.index).__finalize__(
   4239         self, method="map"
   4240     )
 
File ~/opt/anaconda3/lib/python3.9/site-packages/pandas/core/base.py:880, in IndexOpsMixin._map_values(self, mapper, na_action)
    877         raise ValueError(msg)
    879 # mapper is a function
--> 880 new_values = map_f(values, mapper)
    882 return new_values
 
File ~/opt/anaconda3/lib/python3.9/site-packages/pandas/_libs/lib.pyx:2870, in pandas._libs.lib.map_infer()
 
Input In [21], in fun(stri)
      5 def fun(stri):
      6     if stri is not None:
----> 7         for elem in stri.split():
      8             if elem.isnumeric():
      9                 e = int(elem)
 
AttributeError: 'float' object has no attribute 'split'
Типы данных моего df
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<class 'pandas.core.frame.DataFrame'>
Int64Index: 16713 entries, 0 to 16714
Data columns (total 12 columns):
 #   Column        Non-Null Count  Dtype  
---  ------        --------------  -----  
 0   name          16711 non-null  object 
 1   platform      16713 non-null  object 
 2   year          16444 non-null  float64
 3   genre         16711 non-null  object 
 4   na            16713 non-null  float64
 5   eu            16713 non-null  float64
 6   jp            16713 non-null  float64
 7   other         16713 non-null  float64
 8   critic_score  8137 non-null   float64
 9   user_score    7590 non-null   float64
 10  esrb          16713 non-null  object 
 11  game_total    16713 non-null  float64
dtypes: float64(8), object(4)
memory usage: 1.7+ MB
Добавлено через 2 часа 7 минут
В алгоритме разобрался, немного подправил в соответствии со своим пониманием, также заменил name с типа object на string, но все равно выдает ошибку: не понимаю, при чем NAType, если в функции есть проверка на NaN
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
df.name=df['name'].astype('string')
c=df.year.min()
d=df.year.max() 
 
def fun(stri):
    if stri is not None:
        for elem in stri.split():
            if elem.isnumeric():
                e = int(elem)
                if c <= e <= d:
                    return e
            else:
                return np.nan
 
 
df['year'] = df['year'].fillna(df['name'].apply(fun))
df
Ошибка
Code
1
2
3
4
5
6
7
8
Input In [25], in fun(stri)
      3 def fun(stri):
      4     if stri is not None:
----> 5         for elem in stri.split():
      6             if elem.isnumeric():
      7                 e = int(elem)
 
AttributeError: 'NAType' object has no attribute 'split'
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
03.09.2022, 17:36
Tetr1s, По поводу
Ответ получается
https://www.online-python.com/qmRrfu9eET

Добавлено через 3 минуты
Тип object подразумевает в том числе string

Добавлено через 2 минуты
6-ю строчку можно попробовать так (условие):
Python
1
if stri is not None and stri==stri:
Или вместо условия - try... except... с возвратом при исключении np.nan
Если не поможет, то лучше сам файл выложить...

Добавлено через 3 минуты
https://www.online-python.com/yOEMzerKvG
0
1 / 1 / 0
Регистрация: 08.07.2011
Сообщений: 50
03.09.2022, 19:12  [ТС]
Прикрепил архив
Вложения
Тип файла: zip Архив.zip (342.3 Кб, 2 просмотров)
0
Эксперт Python
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
04.09.2022, 05:49
Tetr1s, Всё таки лучше с regex:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import pandas as pd
import numpy as np
import re
 
df = pd.read_csv('games.csv') 
print(df['Year_of_Release'].info())
 
c = df['Year_of_Release'].min()
d = df['Year_of_Release'].max() 
 
def fun(stri):
    if stri is not None and stri==stri:
        tmp = re.findall(r'\d+', stri)
        if len(tmp):
            for elem in tmp:
                e = int(elem)
                if c <= e <= d:
                    return e
    return np.nan
 
 
ind1 = np.where(df['Year_of_Release'].values != df['Year_of_Release'].values)[0]
 
df['Year_of_Release'] = df['Year_of_Release'].fillna(df['Name'].map(fun))
 
ind2 = np.where(df['Year_of_Release'].values != df['Year_of_Release'].values)[0]
 
print('\nиндексы строк датафрейма, где отсутствуют "года", которые есть в "Name"\n', np.setxor1d(ind1, ind2), '\n')
 
df['Year_of_Release'].info()
1
1 / 1 / 0
Регистрация: 08.07.2011
Сообщений: 50
05.09.2022, 04:19  [ТС]
Огромное спасибо !

Заработало !
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2022, 04:19
Помогаю со студенческими работами здесь

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

Как перенести значения одного столбца вместо значений другого столбца, и вместо перенесенного столбца?
Добрый день, ребята, прошу помощи необходимо при нажатии на кнопку Перенос остатков, чтобы данные столбца , которые были на конец...

Поделить значения элементов каждого столбца матрицы на значение первого элемента этого столбца
Преобразовать двумерный массив H, поделив значения элементов каждой колонки на значение первого элемента этой колонки

Как значения для default брать из другого столбца?
Всем привет. Нужна помощь. Извиняюсь, если этот вопрос уже поднимался, но что-то не смог найти его на форуме. Суть: есть табличка,...

Как при выводе данных из бд не выводить пустые значения из столбца?
Вывожу все данные из столбца, но выводятся и пустые строки &lt;?php $dbcon = mysql_connect(&quot;localhost&quot;, &quot;root&quot;,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
Уведомление о неверно выбранном значении справочника
Maks 06.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "НарядПутевка", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если в документе выбран неверный склад. . .
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru