Adjust for loop to only return values based on frequency of occurence in df

Viewed 41

I have a dataframe df:

index   value   value_count
0       10      1
1       50      2
2       50      2
3       20      2
4       20      2
5       30      2
6       30      2

I want to analyze each unique value in separate dataframes. To create separate dataframes (='subdf_{i}') I use the code:

results = {}

for i, j in enumerate(df.value.unique()):
    results[f'subdf_{i}'] = df[df.value.eq(j)]

This gives me a subdf like this for every unique value:

subdf_1

index   value   value_count
0       10      1

subdf_2

index   value   value_count
1       50      2
2       50      2

subdf_3

...

Instead of returning subdataframes for all my unique values, I'd like subdataframes to be created for only the 3 most common values (i.e. 50, 30, 20 for the example above).

How can I adjust my code above to get to this result?

Thank you.

2 Answers

Adjust your code to

df1=df[df.value_count==df.value_count.max()]

results = {}

for i, j in enumerate(df1.value.unique()):
    results[f'subdf_{i}'] = df1[df1.value.eq(j)]

By using the groupby

results = {f'subdf_{x}' : y  for x , y in df1.groupby('value')}

Use Series.value_counts on column value and use slicing to get top three most common column values, then use dict comprehension to store the top three subdf having most common values:

idx = df['value'].value_counts().index[:3]
results = {f'subdf_{i}': df[df['value'].eq(v)] for i, v in enumerate(idx, 1)}

Result:

print(results['subdf_1'])

   index  value  value_count
5      5     30            2
6      6     30            2
Related