Условное копирование данных в зависимости от повторяющихся значений в столбце. - PullRequest
1 голос
/ 18 октября 2019

Я хочу создать новый фрейм данных на основе существующего фрейма финансовых транзакций, но только если в определенном столбце есть повторяющиеся значения.

Для простоты у меня есть df1 с 3 столбцами:'a' 'b' 'c' и сотни строк. Я хотел бы скопировать все строки, когда значение в столбце b повторяется 3 или более раз. Другими словами, если 3 или более строк имеют одинаковое значение b, я хочу скопировать их в df2.

. Я пробовал

df2 = df1.where(df1.b.value_counts() > 2)

, но это приводит к повороту всех строк. до NaN. Вместо того, чтобы продолжать угадывать и проверять другой код, я надеялся указать правильное направление.

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

Используйте groupy() с np.where()

Рассмотрите этот образец:

>>> df = pd.DataFrame({'id':[1,2,3,4,5], 'tag': ['a','a','a','d','e']})
>>> df
   id tag
0   1   a
1   2   a
2   3   a
3   4   d
4   5   e

>>> df['counter'] = df.groupby(['tag'])['tag'].transform('count')
>>> df
   id tag  counter
0   1   a        3
1   2   a        3
2   3   a        3
3   4   d        1
4   5   e        1

>>> df['counter'] = np.where(df['counter'] > 2, ['Retain'], ['Remove'])
>>> df
   id tag counter
0   1   a  Retain
1   2   a  Retain
2   3   a  Retain
3   4   d  Remove
4   5   e  Remove

>>> df = df[df['counter'].isin(['Retain'])]
>>> df
   id tag counter
0   1   a  Retain
1   2   a  Retain
2   3   a  Retain
0 голосов
/ 18 октября 2019

Добавить столбец, который помечает значения для сохранения, а затем фильтровать по ним:

# Make a boolean series as a mapping of values with more than 2 counts
more_than_2_values = df1.b.value_counts() > 2
# Add a new column that indicates which values should be kept
df1["more_than_2"] = df["b"].map(more_than_2_values).fillna(False)
# Filter the data, drop the label column if desired
desired_result = df1[df1["more_than_2"].drop(columns="more_than_2"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...