我正在尝试弄清楚如何使用这些数据来操作这个数据框:
df = pd.DataFrame({
'Name': {0: 'A', 1: 'B', 2: 'B', 3: 'A', 4: 'A'},
'Col1': {0: True, 1: False, 2: False, 3: False, 4: True},
'Col2': {0: 'x', 1: 'y', 2: 'y', 3: 'x', 4: 'y'}
})
Name Col1 Col2
0 A True x
1 B False y
2 B False y
3 A False x
4 A True y
我想要得到的结果是根据名称列对 col1 和 col2 的每个唯一值进行计数
Name True False x y
A 2 1 2 1
B 0 2 0 2
我能够手动计算一些列...但我觉得使用 Pandas 可能有更有效的方法
table = df["Name"].unique().tolist()
for i in table:
rows = df[df['Name'] == i]
number_true = (rows["Col1"] == "True").sum()
number_false = (rows["Col1"] == "False").sum()
答案 0 :(得分:2)
尝试使用 pd.get_dummies
+ groupby sum
:
new_df = (
pd.get_dummies(df, columns=['Col1', 'Col2'])
.groupby('Name', as_index=False)
.sum()
)
new_df
:
Name Col1_False Col1_True Col2_x Col2_y
0 A 1 2 2 1
1 B 2 0 0 2
没有前缀或prefix_sep:
new_df = (
pd.get_dummies(df, columns=['Col1', 'Col2'],
prefix_sep='', prefix='')
.groupby('Name', as_index=False)
.sum()
)
new_df
:
Name False True x y
0 A 1 2 2 1
1 B 2 0 0 2
答案 1 :(得分:0)
另一种方法是使用 cv2
列作为 ID melt 您的 df,这将允许您pivot 继续使用您的 Name
列作为索引。>
Name
出:
价值 | 假 | 真实 | x | y |
---|---|---|---|---|
姓名 | ||||
A | 1 | 2 | 2 | 1 |
B | 2 | 0 | 0 | 2 |
df = (
pd.melt(df, id_vars=['Name'])
.pivot_table(columns='value', aggfunc='count', index='Name', values='variable', fill_value=0)
)
df
出:
姓名 | 假 | 真实 | x | y |
---|---|---|---|---|
A | 1 | 2 | 2 | 1 |
B | 2 | 0 | 0 | 2 |
编辑以包含@henry-ecker 的评论。