Уникальные комбинации значений в выбранных столбцах в кадре данных pandas и счетчике
У меня есть данные в кадре данных pandas следующим образом:
df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})
Итак, мои данные выглядят как
----------------------------
index A B
0 yes yes
1 yes no
2 yes no
3 yes no
4 no yes
5 no yes
6 yes no
7 yes yes
8 yes yes
9 no no
-----------------------------
Я хотел бы преобразовать его в другой фрейм данных. Ожидаемый вывод может быть показан на следующем питоне script:
output = pd.DataFrame({'A':['no','no','yes','yes'],'B':['no','yes','no','yes'],'count':[1,2,4,3]})
Итак, мой ожидаемый результат выглядит так:
--------------------------------------------
index A B count
--------------------------------------------
0 no no 1
1 no yes 2
2 yes no 4
3 yes yes 3
--------------------------------------------
Фактически, я могу найти, чтобы найти все комбинации и подсчитать их, используя следующую команду: mytable = df1.groupby(['A','B']).size()
Однако оказывается, что такие комбинации находятся в одном столбце. Я хотел бы разделить каждое значение в комбинации на другой столбец, а также добавить еще один столбец для результата подсчета. Можно ли это сделать? Могу ли я предложить свои предложения? Заранее благодарю вас.
Ответы
Ответ 1
Вы можете groupby
в колонках "A" и "B" и вызвать size
, а затем reset_index
и rename
сгенерированный столбец:
In [26]:
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
Out[26]:
A B count
0 no no 1
1 no yes 2
2 yes no 4
3 yes yes 3
Обновление
Небольшое объяснение, группируя по 2 столбцам, это группы строк, где значения A и B одинаковы, мы вызываем size
, который возвращает число уникальных групп:
In[202]:
df1.groupby(['A','B']).size()
Out[202]:
A B
no no 1
yes 2
yes no 4
yes 3
dtype: int64
Итак, теперь для восстановления сгруппированных столбцов мы вызываем reset_index
:
In[203]:
df1.groupby(['A','B']).size().reset_index()
Out[203]:
A B 0
0 no no 1
1 no yes 2
2 yes no 4
3 yes yes 3
Это восстанавливает индексы, но агрегация размера превращается в сгенерированный столбец 0
, поэтому мы должны переименовать это:
In[204]:
df1.groupby(['A','B']).size().reset_index().rename(columns={0:'count'})
Out[204]:
A B count
0 no no 1
1 no yes 2
2 yes no 4
3 yes yes 3
groupby
принимает аргумент arg as_index
, который мы могли бы установить в False
, поэтому он не делает сгруппированные столбцы индексом, но это создает series
, и вам все равно придется восстанавливать индексы и т.д....:
In[205]:
df1.groupby(['A','B'], as_index=False).size()
Out[205]:
A B
no no 1
yes 2
yes no 4
yes 3
dtype: int64
Ответ 2
Немного связанный, я искал уникальные комбинации, и я придумал этот метод:
def unique_columns(df,columns):
result = pd.Series(index = df.index)
groups = meta_data_csv.groupby(by = columns)
for name,group in groups:
is_unique = len(group) == 1
result.loc[group.index] = is_unique
assert not result.isnull().any()
return result
И если вы хотите только утверждать, что все комбинации уникальны:
df1.set_index(['A','B']).index.is_unique
Ответ 3
Как объяснил EdChum, это работает:
df1.groupby([ 'А', 'В']) размер() reset_index() переименования (столбцы = {0: 'Count'})...
Ответ 4
Помещение @EdChum очень приятного ответа в функцию count_unique_index
.
Уникальный метод работает только с сериями панд, а не с фреймами данных.
Функция ниже воспроизводит поведение уникальной функции в R:
unique возвращает вектор, фрейм данных или массив, такой как x, но с удаленными дублирующимися элементами/строками.
И добавляет количество вхождений в соответствии с запросом OP.
df1 = pd.DataFrame({'A':['yes','yes','yes','yes','no','no','yes','yes','yes','no'],
'B':['yes','no','no','no','yes','yes','no','yes','yes','no']})
def count_unique_index(df, by):
return df.groupby(by).size().reset_index().rename(columns={0:'count'})
count_unique_index(df1, ['A','B'])
A B count
0 no no 1
1 no yes 2
2 yes no 4
3 yes yes 3