Как извлечь данные по количеству повторяющихся строк? - PullRequest
1 голос
/ 06 января 2020

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

x = {'column1': ['a','a','b','b','b','c','c','c','d'],
    'column2': [22000,25000,27000,350,0,3,5,4,312]
    }
df = pd.DataFrame(x, columns = ['column1', 'column2'])
print (df)

Первый набор данных должен выглядеть так:

x = {'column1': ['d'],
    'column2': [312]
    }
df = pd.DataFrame(x, columns = ['column1', 'column2'])
print (df)

Второй набор данных должен выглядеть следующим образом:

x = {'column1': ['a','a','b','b','c','c'],
    'column2': [22000,25000,27000,350,3,5]
    }
df = pd.DataFrame(x, columns = ['column1', 'column2'])
print (df)

Третий набор данных должен выглядеть следующим образом:

x = {'column1': ['b','b','b','c','c','c'],
    'column2': [27000,350,0,3,5,4]
    }
df = pd.DataFrame(x, columns = ['column1', 'column2'])
print (df)

Как бы это сделать не вручную?

Ответы [ 2 ]

2 голосов
/ 06 января 2020

Сначала создайте счетчик Series по счетам:

x = {'column1': ['a','a','b','b','b','c','c','c','d'],
    'column2': [22000,25000,27000,350,0,3,5,4,312]
    }
df = pd.DataFrame(x, columns = ['column1', 'column2'])
print (df)

s = df.groupby('column1')['column1'].transform('size')
#alternative
#s = df['column1'].map(df['column1'].value_counts())
print (s)
0    2
1    2
2    3
3    3
4    3
5    3
6    3
7    3
8    1
Name: column1, dtype: int64

А затем по списку создайте DataFrames с фильтром по GroupBy.head:

L = [df[s >= i].groupby(['column1',s]).head(i) if i > 1 else g for i, g in df.groupby(s)]
print (L[0])
print (L[1])
print (L[2])
  column1  column2
8       d      312
  column1  column2
0       a    22000
1       a    25000
2       b    27000
3       b      350
5       c        3
6       c        5
  column1  column2
2       b    27000
3       b      350
4       b        0
5       c        3
6       c        5
7       c        4

РЕДАКТИРОВАТЬ1: Поскольку решение является более сложным, создается пользовательская функция и для строк со значениями 3 используется GroupBy.nth:

def func(x, g):
    if x == 1:
        return g
    else:
        df1 = df[s >= x].groupby(['column1',s]).head(x)
        if x == 3:
            return (df1.groupby(['column1',s], group_keys=False)
                       .nth([0, -1])
                       .reset_index(level=1, drop=True)
                       .reset_index())

        else:
            return df1

L = [func(i, g) for i, g in df.groupby(s)]
print (L[0])
print (L[1])
print (L[2])
  column1  column2
8       d      312
  column1  column2
0       a    22000
1       a    25000
2       b    27000
3       b      350
5       c        3
6       c        5
  column1  column2
0       b    27000
1       b        0
2       c        3
3       c        4
1 голос
/ 06 января 2020

Другое решение состоит в том, чтобы найти count из column1 и найти подмножество фрейма данных с таким же счетом для column1

df2 = df.groupby(['column1']).agg({'column2' : 'count'}).reset_index()
for cnt in df2['column2'].sort_values().unique():
    print(df[df['column1'].isin(df2[df2['column2'] == cnt]['column1'])])

Это даст вам вывод

  column1  column2
8       d      312
  column1  column2
0       a    22000
1       a    25000
  column1  column2
2       b    27000
3       b      350
4       b        0
5       c        3
6       c        5
7       c        4
...