J'ai un ensemble de données avec 2 colonnes qui ressemblent à:
|group| |sequence|
A BX
A X
B SFS
B BCX
B BSS*B1S
A BBX
Je voudrais un moyen de pouvoir grouper et trouver la fréquence de chaque personnage, pour obtenir quelque chose comme ceci:
|group| |char| |freq|
A B 3
A X 3
B S 5
...
3 réponses
Vous pouvez utiliser une solution efficace basée sur repeat
suivie de groupby
:
from itertools import chain
# Step 1 - flatten your dataframe
df = pd.DataFrame({
'group' : df['group'].repeat(df.sequence.str.len()),
'char' : list(chain.from_iterable(df.sequence.tolist()))
})
# Step 2 - filter out characters and groupby on `group`
df[df.char.str.isalpha()].groupby(['group', 'char']).size().reset_index(name='freq')
group char freq
0 A B 3
1 A X 3
2 B B 3
3 B C 1
4 B F 1
5 B S 5
6 B X 1
Voici quelques façons différentes de présenter vos résultats.
L'application de groupby.sum
sur des chaînes les concatène, après quoi nous pouvons appliquer pd.value_counts
.
df = pd.DataFrame({'group': ['A', 'A', 'B', 'B', 'B', 'A'],
'sequence': ['BX', 'X', 'SFS', 'BCX', 'BSS*B1S', 'BBX']})
res = df.groupby('group')['sequence'].sum().map(list).apply(pd.value_counts)\
.fillna(0).astype(int).reset_index()
res = res.loc[:, res.columns.str.isalpha()]
print(res)
# group B C F S X
# 0 A 3 0 0 0 3
# 1 B 3 1 1 5 1
res2 = pd.melt(res, id_vars=['group']).sort_values(['group', 'variable'])
res2 = res2[res2['value'] != 0].set_index(['group', 'variable'])
# value
# group variable
# A B 3
# X 3
# B B 3
# C 1
# F 1
# S 5
# X 1
print(res2)
Une variation plus efficace est possible avec collections.Counter
:
from collections import Counter
res = df.groupby('group')['sequence'].sum().apply(Counter).apply(pd.Series)\
.fillna(0).astype(int).reset_index()
Utilisez une compréhension pour créer une liste de tuples.
c = pd.value_counts([(g, s) for g, S in df.values for s in S if s.isalpha()])
pd.DataFrame(
np.column_stack([c.index.tolist(), c.values]),
columns=df.columns.tolist() + ['freq']
)
group sequence freq
0 B S 5
1 A B 3
2 B B 3
3 A X 3
4 B F 1
5 B C 1
6 B X 1
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.