@Goblin1101

Как правильно заменить значения в столбцах фрейма данных python pandas?

У меня есть dataframe, в котором есть пустой столбец и столбец, значение в котором имеет тип список. Суть в том, что мне нужно заменить значение в столбце со списком на максимальное значение, которое в этом самом списке находится, а в пустой столбец записать индекс, который был у этого максимального значения в списке. И так для каждой строки. Документация pandas говорит, что это можно как-то сделать с помощью loc, но как, додуматься я уже не могу. При попытке пройтись по нему циклом выдаёт такое сообщение, а столбцы не меняет.
<ipython-input-125-b0f73295a4c7>:28: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  genres.iloc[i]['clusters'] = max(genres.iloc[i]['clusters'])


Сам фрейм:
genres                                           clusters  \
0                 [Indie]  [0.072281362, 0.0367577778, 0.0035245587, 0.00...   
1    [Role-playing (RPG)]  [0.0207314411, 0.008785802, 0.007276394, 0.005...   
2                [Puzzle]  [0.0309290634, 0.0633695299, 0.004186461, 0.00...   
3             [Simulator]  [0.0095561385, 0.0136525575, 0.0268809393, 0.7...   
4                [Racing]  [0.0348487218, 0.0180101217, 0.0080957065, 0.0...   
..                    ...                                                ...   
226   [Card & Board Game]  [0.0726162447, 0.0187043791, 0.0086693631, 0.0...   
227            [Platform]  [0.0276185281, 0.0556897291, 0.0043596096, 0.0...   
228               [Indie]  [0.0388500644, 0.0284262101, 0.015074557, 0.02...   
229               [Sport]  [0.0083113202, 0.005286851, 0.0243050079, 0.00...   
230           [Simulator]  [0.0262762039, 0.0137836755, 0.0129542615, 0.0...   

    cluster_index  
0                  
1                  
2                  
3                  
4                  
..            ...  
226                
227                
228                
229                
230


Как реализовано:
# Добавляю пустой столбец
genres['cluster_index'] = ''
for i in genres.index:
  genres.iloc[i]['cluster_index'] = max(enumerate(genres.iloc[i]['clusters']),key=lambda x: x[1])[0]
  genres.iloc[i]['clusters'] = max(genres.iloc[i]['clusters'])
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
Maksim_64
@Maksim_64
Data Analyst
df = pd.DataFrame({
    'A':[[5,6,24,3],[23,11,15],[3,100]],
    'B':np.NaN
})
(
    df.assign(
        A_max =lambda x: x['A'].apply(max),
        B_indexmax =lambda x: x['A'].apply(lambda x: pd.Series(x).idxmax()),
    )
)

Пару слов.
1. Для замены. Вместо A_max, B_index_max меняем на А и B и меняем их местами сначала B потом A. Так делать плохая практика. Не нужно тебе A и B колонки просто выкинь их отдельно, а эти переименуй.

2. loc мощный инструмент, для выборок он у меня наверное почти в каждом запросе присутствует но для выборок Для процессирования колонок плохая практика
df.loc[:,[колонка]] = массив, вот так старайся не делать. Используй assign, как у меня в примере.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы