Выберите строки в DataFrame, где число идентификаторов больше, чем X - PullRequest
3 голосов
/ 11 марта 2019

У меня есть Dataframe, который столбец, который содержит идентификатор. Этот идентификатор представляет человека и может присутствовать много раз:

        col_id    col2     col3     col4....
row1      1
row2      1
row3      2
row4      3
row5      3
row6      3
row7      1
row8      7

Мне нужно вернуть новый фрейм данных, где значение value_counts столбца ID больше, чем, скажем, 2.

Новый фрейм данных:

         col_id    col2     col3     col4....
row1      1
row2      1
row3      3
row4      3
row5      3
row6      1

Этот новый фрейм данных содержит строки, в которых число идентификаторов превышает только 2.

Редактировать

Отсюда мне нужно отделить данные по ID. В идеале я хотел бы получить решение, в котором бы для каждого идентификатора имелся фрейм данных:

Dataframe 1

    col_id   col2    col3    col4....
r1     1
r2     1
r3     1

Датафрейм 2

    col_id   col2    col3    col4....
r1     2
r2     2
r3     2

Датафрейм 3

    col_id   col2    col3    col4....
r1     3
r2     3
r3     3

Можно ли объединить их в один большой массив данных? Таким образом, у меня может быть новый столбец, называемый «индекс», который содержит строки для идентификатора == 1, идентификатора == 2 и т. Д .:

index
  1        col_id   col2    col3    col4....
       r1     1
       r2     1
       r3     1



index
  2       col_id   col2    col3    col4....
      r1     2
      r2     2
      r3     2


    index
       3      col_id   col2    col3    col4....
         r1     3
         r2     3
         r3     3

Ответы [ 2 ]

4 голосов
/ 11 марта 2019

Используйте GroupBy.transform с GroupBy.size для Series с тем же размером, что и исходный DataFrame, поэтому возможна фильтрация по boolean indexing:

df = df[df.groupby('col_id')['col_id'].transform('size') > 2]
print (df)
      col_id
row1       1
row2       1
row4       3
row5       3
row6       3
row7       1

Если производительность не важна или мала DataFrame возможно использовать DataFrameGroupBy.filter:

df = df.groupby('col_id').filter(lambda x: len(x) > 2)

РЕДАКТИРОВАТЬ: для отдельных DataFrames на col_id возможносоздать словарь DataFrames:

dfs = dict(tuple(df.groupby('col_id')))
print (dfs[1])
      col_id
row1       1
row2       1
row7       1

print (dfs[2])
      col_id
row3       2

print (dfs[3])
      col_id
row4       3
row5       3
row6       3

Возможное, но непитоновое решение с глобалами, не рекомендуется использовать (только для развлечения):

for i, df in df.groupby('col_id'):
    globals()['df{}'.format(i)] =  df

print (df1)
      col_id
row1       1
row2       1
row7       1
1 голос
/ 11 марта 2019

Если вы хотите продолжить свой метод value_counts(), то следуйте -

# Creating a dictionary using value_counts()
items = df.col_id.value_counts().to_dict().items()

# Filtering only those rows where duplicate entries occur more than n
n = 2
df = df[df.col_id.isin([key for key, val in items if val > n])]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...