Установить значение для конкретного столбца в дублированном DataFrame, используя индекс - PullRequest
1 голос
/ 24 апреля 2020

Я создал Pandas DataFrame

import pandas as pd
students = [('jack', 34, 'Sydeny'),
            ('Riti', 30, 'Delhi'),
            ('Aadi', 16, 'New York'),
            ('Riti', 30, 'Delhi'),
            ('Riti', 30, 'Delhi'),
            ('Riti', 30, 'Mumbai'),
            ('Aadi', 40, 'London'),
            ('Sachin', 30, 'Delhi')
            ]

# Create a DataFrame object
dfObj = pd.DataFrame(students, columns=['Name', 'Age', 'City'])

Я хочу найти дублированные значения из вышеупомянутого DataFrame, поэтому он использовал inbuild duplicated () для поиска дублирующихся значений

duplicateRowsDF = dfObj[dfObj.duplicated()]

и получил это

Duplicate Rows except first occurrence based on all columns are :
   Name  Age   City
3  Riti   30  Delhi
4  Riti   30  Delhi

Затем я хотел изменить значения в столбце имени duplicateRowsDF, поэтому я попытался перебрать duplicateRowsDF

for i in range(len(duplicateRowsDF)):
    duplicateRowsDF.at[i,'Name']= 'rohit'

, но содержимое duplicateRowsDF не изменилось вместо этого он добавил две строки новостей с новым индексом

 Name   Age   City
3   Riti  30.0  Delhi
4   Riti  30.0  Delhi
0  rohit   NaN    NaN
1  rohit   NaN    NaN

Я хочу выводить как

Name   Age   City
    3   rohit  30.0  Delhi
    4   rohit  30.0  Delhi

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 24 апреля 2020

Вы можете создать новый столбец в отфильтрованном фрейме данных с помощью DataFrame.copy, чтобы избежать возможного SettingWithCopyWarning:

duplicateRowsDF = dfObj[dfObj.duplicated()].copy()
duplicateRowsDF['Name'] = 'rohit'

Или используйте DataFrame.assign:

duplicateRowsDF = dfObj[dfObj.duplicated()].assign(Name='rohit')

Ваше решение возможно, но медленно с DataFrame.iat и Index.get_loc для позиций:

for i in range(len(duplicateRowsDF)):
    duplicateRowsDF.iat[i,duplicateRowsDF.columns.get_loc('Name')]= 'rohit'
1 голос
/ 24 апреля 2020

Вам не нужно все oop, просто используйте .lo c

duplicateRowsDF = dfObj.loc[dfObj.duplicated()]
duplicateRowsDF.loc[:,'Name'] = 'rohit'

    Name    Age City
3   rohit   30  Delhi
4   rohit   30  Delhi
...