Ошибка: ни один из [Index (['...'], dtype = 'object')] отсутствует в [index] - PullRequest
1 голос
/ 12 апреля 2020

Я пытаюсь удалить сгруппированный набор строк в pandas в соответствии со следующим условием:

Если группа (сгруппированная по col1) имеет более 2 значений 'c' в col2, затем удалите всю группу.

Что у меня выглядит вот так

  col1  col2                       
0  A     10:10 
1  A     20:05
2  A     c
3  A     00:10
4  B     04:15
2  B     c
3  B     c
4  B     13:40

И я пытаюсь добраться сюда:

  col1  col2                       
0  A     10:10 
1  A     20:05
2  A     c
3  A     00:10

Обычно я делаю это для других очень похожие кадры данных (и это работает):

df = df.groupby('col1').filter(lambda x: x["col2"].value_counts()[['c']].sum() < 2)

Но для этого не работает, и я получаю эту ошибку:

KeyError: "None of [Index(['c'], dtype='object')] are in the [index]"

Есть ли у кого-то идея о том, как я мог бы сделать это?

Спасибо!

Ответы [ 3 ]

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

Вот еще один метод, использующий loc для создания временного фрейма данных, который берет количество значений 'c' в 'col2', сгруппированных по 'col1', и отправляет счетчики '<2' в список. Затем выполните еще один lo c на исходном фрейме данных, чтобы отфильтровать группу 'col1', используя <code>.isin(), если они были помечены как столбец с менее чем 2 счетами 'c' на группу из временного фрейма / списка данных. dft ':

dft = df.loc[df['col2'] == 'c'].groupby('col1').count().reset_index()
dft = dft.loc[dft['col2'] < 2, 'col1'].to_list()
df = df.loc[df['col1'].isin(dft)]
df
1 голос
/ 12 апреля 2020

Вы можете использовать len:

df.groupby('col1').filter(lambda x: len(x.loc[x.col2.eq('c')])<2)

    col1    col2
0   A   10:10
1   A   20:05
2   A   c
3   A   00:10

Ваше решение на самом деле также работает для меня:

df.groupby('col1').filter(lambda x: x["col2"].value_counts()[['c']].sum() < 2)

Если оно все еще не работает, вы можете попробовать следующее, чтобы увидеть, если это помогает.

df.astype(str).groupby('col1').filter(lambda x: x["col2"].value_counts()[['c']].sum() < 2)
0 голосов
/ 12 апреля 2020

Я предлагаю использовать для улучшения производительности boolean indexing:

df = df[df['col2'].eq('c').groupby(df['col1']).transform('sum').lt(2)]
print (df)
  col1   col2
0    A  10:10
1    A  20:05
2    A      c
3    A  00:10

Подробности :

Первое сравнение значений по Series.eq для ==:

print (df['col2'].eq('c'))
0    False
1    False
2     True
3    False
4    False
2     True
3     True
4    False
Name: col2, dtype: bool

Затем подсчитайте True значение для групп по GroupBy.transform с sum, True s обрабатываются как 1:

print (df['col2'].eq('c').groupby(df['col1']).transform('sum'))
0    1.0
1    1.0
2    1.0
3    1.0
4    2.0
2    2.0
3    2.0
4    2.0
Name: col2, dtype: float64

И последний фильтр по Series.lt для меньшего:

print (df['col2'].eq('c').groupby(df['col1']).transform('sum').lt(2))
0     True
1     True
2     True
3     True
4    False
2    False
3    False
4    False
Name: col2, dtype: bool
...