Reputation: 182
I have a dataframe as below:
data = [['A', 1], ['A', 0], ['A', 1], ['B', 0], ['B', 1], ['C', 1], ['C', 1], ['C', 1]]
temp_df = pd.DataFrame(data, columns = ['Name', 'effect'])
Name effect
0 A 1
1 A 0
2 A 1
3 B 0
4 B 1
5 C 1
6 C 1
7 C 1
After doing a groupby
I'm getting:
temp_df.groupby(['Name','effect']).size().reset_index(name='count')
Name effect count
0 A 0 1
1 A 1 2
2 B 0 1
3 B 1 1
4 C 1 3
But I need my result to look like a frequency table:
Name | e0 | e1 |
---|---|---|
A | 1 | 2 |
B | 1 | 1 |
C | 0 | 3 |
Upvotes: 2
Views: 356
Reputation: 52
data = [['A', 1], ['A', 0], ['A', 1], ['B', 0], ['B', 1], ['C', 1], ['C', 1], ['C', 1]]
temp_df = pd.DataFrame(data, columns = ['Name', 'e0'])
print(temp_df)
temp_df.groupby(['Name','e0']).size().reset_index(name='e1')
Upvotes: 1
Reputation: 41327
You can cross-tabulate with crosstab()
. To add e
to the column names, chain add_prefix()
:
pd.crosstab(temp_df.Name, temp_df.effect).add_prefix('e')
# effect e0 e1
# Name
# A 1 2
# B 1 1
# C 0 3
Upvotes: 6
Reputation: 75080
Groupby with value counts and unstack:
out = temp_df.groupby("Name")['effect'].value_counts().unstack(fill_value=0)
out = out.add_prefix(out.columns.name).rename_axis(columns=None).reset_index()
print(out)
Name effect0 effect1
0 A 1 2
1 B 1 1
2 C 0 3
Upvotes: 4
Reputation: 195418
You can use .pivot_table()
:
print(
temp_df.assign(tmp=temp_df["effect"])
.pivot_table(
index="Name",
columns="effect",
values="tmp",
aggfunc="count",
fill_value=0,
)
.add_prefix("e")
.reset_index()
)
Prints:
effect Name e0 e1
0 A 1 2
1 B 1 1
2 C 0 3
Upvotes: 2