Как извлечь данные с помощью groupby при определенных условиях c? - PullRequest
0 голосов
/ 07 января 2020

У меня есть такой набор данных:

x = {'column1': ['a','a','b','b','b','c','c','c','d'],
    'column2': [1,0,1,1,0,1,1,0,1]
    }
df = pd.DataFrame(x, columns = ['column1', 'column2'])
print (df)

Как мне извлечь данные только из второго столбца, который имеет значение один (как это):

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

Также как я посчитал бы число единиц для каждого значения в столбце 1 и создал бы новый столбец и вставил бы эту информацию для соответствующих индексов в coulmn_1 (например, сколько единиц имеют индексное значение a в column_1?). Таким образом, он превращает фрейм данных в этот формат:

x = {'column1': ['a','b','b','c','c','d'],
    'column2': [1,1,1,1,1,1],
 'column3': [1,2,2,2,2,1]
    }
df = pd.DataFrame(x, columns = ['column1', 'column2','column3'])
print (df)

Ответы [ 2 ]

3 голосов
/ 07 января 2020

Первый вопрос:

df[df.column2==1].reset_index(drop=True)

даст вам


    column1     column2
0   a   1
1   b   1
2   b   1
3   c   1
4   c   1
5   d   1

Второй вопрос:

df['column3'] = df.groupby('column1').transform(len)

даст вам


    column1     column2     column3
0   a   1   1
1   b   1   2
2   b   1   2
3   c   1   2
4   c   1   2
5   d   1   1
1 голос
/ 07 января 2020

Используйте boolean indexing с Series.eq для сравнения, например ==, а затем Series.map с Series.value_counts :

df = df[df['column2'].eq(1)]
df['column3'] = df['column1'].map(df['column1'].value_counts())

Альтернатива с GroupBy.transform и GroupBy.size:

df['column3'] = df.groupby('column1')['column1'].transform('size')

print (df)
  column1  column2  column3
0       a        1        1
2       b        1        2
3       b        1        2
5       c        1        2
6       c        1        2
8       d        1        1

Последняя по умолчанию индекс использования DataFrame.reset_index с drop=True:

df = df.reset_index(drop=True)
print (df)
  column1  column2  column3
0       a        1        1
1       b        1        2
2       b        1        2
3       c        1        2
4       c        1        2
5       d        1        1
...