基于另一列的一列中唯一值的计数

时间:2021-06-11 00:17:52

标签: python pandas dataframe

我正在尝试弄清楚如何使用这些数据来操作这个数据框:

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()

2 个答案:

答案 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 的评论。