Я работаю с кадром данных о руководителях округа. Я хочу провести панельное исследование, в котором единицей анализа будет год округа.
Проблема в том, что иногда два или более руководителей округа работают в течение одного года. Я хочу удалить эти полудублирующиеся строки. Я ВСЕГДА хочу оставить руководителя округа, который указан первым.
Если мой начальный df:
df <- data.frame(year= c(2000, 2001, 2001, 2002, 2000, 2001, 2002, 2002, 2002),
executive.name= c("Johnson", "Smith", "Peters", "Alleghany", "Roberts", "Clarke", "Tollson", "Brown", "Taschen"),
district= c(1001, 1001, 1001, 1001, 1002, 1002, 1002, 1002, 1002))
Я хочу, чтобы это выглядело так
df.neat <- data.frame(year= c(2000, 2001, 2002, 2000, 2001, 2002),
executive.name= c("Johnson", "Smith", "Alleghany", "Roberts", "Clarke", "Tollson"),
district= rep(c(1001, 1002), each=3))
Вы можете добиться этого, используя функцию drop_duplicates
в pandas, которая поможет вам удалить повторяющиеся строки на основе столбцов year
и district
, сохранив при этом первое вхождение. Вот как это можно сделать на Python:
import pandas as pd
# Create the initial DataFrame
df = pd.DataFrame({
'year': [2000, 2001, 2001, 2002, 2000, 2001, 2002, 2002, 2002],
'executive.name': ['Johnson', 'Smith', 'Peters', 'Alleghany', 'Roberts', 'Clarke', 'Tollson', 'Brown', 'Taschen'],
'district': [1001, 1001, 1001, 1001, 1002, 1002, 1002, 1002, 1002]
})
# Drop duplicates while keeping the first occurrence
df_neat = df.drop_duplicates(subset=['year', 'district'], keep='first').reset_index(drop=True)
# Display the resulting DataFrame
df_neat
В результате df_neat
будет выглядеть так:
year executive.name district
0 2000 Johnson 1001
1 2001 Smith 1001
2 2002 Alleghany 1001
3 2000 Roberts 1002
4 2001 Clarke 1002
5 2002 Tollson 1002
Этот код гарантирует, что для каждой комбинации year
и district
сохраняется только первое вхождение главы округа, эффективно удаляя любые полудублирующиеся строки.
Вы можете выполнить группировку по районам и годам, а затем взять первую строку из каждой группы.
library(dplyr)
df_neat <- df %>%
group_by(district, year) %>%
slice_head(n = 1) %>%
ungroup()
Или в одну строку, df |> dplyr::slice(1, .by = c(district, year))
База R
first = \(x) x[1L]
aggregate(.~year+district, df, first)
#> year district executive.name
#> 1 2000 1001 Johnson
#> 2 2001 1001 Smith
#> 3 2002 1001 Alleghany
#> 4 2000 1002 Roberts
#> 5 2001 1002 Clarke
#> 6 2002 1002 Tollson
Не уверен, какое отношение имеет этот повторяющийся вопрос. Разве это не вопрос о сохранении только первого значения и удалении всех последующих дубликатов? Пока тот отвечает, как удалить все дубликаты? Например. -
df.neat == df[!duplicated(df[c("year","district")]),]
кажется соответствует.