Как правильно пользоваться Pandas для вычисления частоты вхождений в DataFrame?
Имею DataFrame:
ID 2020-01 2020-02 2020-03
1 'ex1' 'ex1' 'ex3'
2 'ex1' 'ex1' 'ex3'
3 'ex2' 'ex2' 'ex3'
4 'ex1' 'ex1' 'ex3'
5 'ex2' 'ex3' 'ex3'
Хочу получить следующий DataFrame:
'2020-01' 2020-02' 2020-03'
'ex1' 3 3 0
'ex2' 2 1 0
'ex3' 0 1 3
Я, конечно, реализовал это циклами, но это же можно и нужно сделать в стиле Pandas.
Ответы (2 шт):
Автор решения: Argo7
→ Ссылка
groups = df.groupby()
groups.ngroups
df1 = pd.DataFrame(data = groups.size())
Попробуйте примерно так.
Автор решения: MaxU
→ Ссылка
In [43]: (df
...: .drop(columns="ID")
...: .stack()
...: .reset_index(level=0, drop=True)
...: .reset_index(name="val")
...: .groupby(["val", "index"])
...: .size()
...: .unstack(1, fill_value=0)
...: .rename_axis(None, axis=1)
...: .rename_axis(None))
Out[43]:
2020-01 2020-02 2020-03
'ex1' 3 3 0
'ex2' 2 1 0
'ex3' 0 1 5
исходный DF:
In [52]: df
Out[52]:
ID 2020-01 2020-02 2020-03
0 1 'ex1' 'ex1' 'ex3'
1 2 'ex1' 'ex1' 'ex3'
2 3 'ex2' 'ex2' 'ex3'
3 4 'ex1' 'ex1' 'ex3'
4 5 'ex2' 'ex3' 'ex3'
решение (пошагово):
In [53]: df.drop(columns="ID").stack()
Out[53]:
0 2020-01 'ex1'
2020-02 'ex1'
2020-03 'ex3'
1 2020-01 'ex1'
2020-02 'ex1'
2020-03 'ex3'
2 2020-01 'ex2'
2020-02 'ex2'
2020-03 'ex3'
3 2020-01 'ex1'
2020-02 'ex1'
2020-03 'ex3'
4 2020-01 'ex2'
2020-02 'ex3'
2020-03 'ex3'
dtype: object
In [54]: df.drop(columns="ID").stack().reset_index(level=0, drop=True)
Out[54]:
2020-01 'ex1'
2020-02 'ex1'
2020-03 'ex3'
2020-01 'ex1'
2020-02 'ex1'
2020-03 'ex3'
2020-01 'ex2'
2020-02 'ex2'
2020-03 'ex3'
2020-01 'ex1'
2020-02 'ex1'
2020-03 'ex3'
2020-01 'ex2'
2020-02 'ex3'
2020-03 'ex3'
dtype: object
In [55]: df.drop(columns="ID").stack().reset_index(level=0, drop=True).reset_index(name="val").groupby(["val", "index"]).size()
Out[55]:
val index
'ex1' 2020-01 3
2020-02 3
'ex2' 2020-01 2
2020-02 1
'ex3' 2020-02 1
2020-03 5
dtype: int64
In [56]: df.drop(columns="ID").stack().reset_index(level=0, drop=True).reset_index(name="val").groupby(["val", "index"]).size().unstack(1, fill_value
...: =0)
Out[56]:
index 2020-01 2020-02 2020-03
val
'ex1' 3 3 0
'ex2' 2 1 0
'ex3' 0 1 5