【问题标题】:How to have a cross tabulation for categorical data in Pandas (Python)?如何在 Pandas (Python) 中对分类数据进行交叉制表?
【发布时间】:2020-01-11 14:25:54
【问题描述】:

例如,我有以下代码。

df = pd.DataFrame(dtype="category")
df["Gender"]=np.random.randint(2, size=100)
df["Q1"] = np.random.randint(3, size=100)
df["Q2"] = np.random.randint(3, size=100)
df["Q3"] = np.random.randint(3, size=100)
df[["Gender", "Q1", "Q2", "Q3"]] = df[["Gender", "Q1", "Q2", "Q3"]].astype('category')
pd.pivot_table(data=df,index=["Gender"])

我想要一个数据透视表,其中包含所有其他列的性别百分比。事实上,如下所示。

如何做到这一点?

上面的代码给出了一个错误,说 No numeric types to aggregate

我没有任何数字列。我只想在男性和女性下找到每个类别的频率,并分别找到它们在男性和女性中的百分比。

【问题讨论】:

    标签: python-3.x pandas pivot-table crosstab


    【解决方案1】:

    正如您的问题所建议的,您可以使用pd.crosstab 来制作您需要的交叉表。

    您只需对您的数据进行快速预处理,即转换为melt 并将Q 列转换为行(详见下文):

    df = df.melt(id_vars='Gender', 
             value_vars=['Q1', 'Q2', 'Q3'], 
             var_name='Question', value_name='Answer' )
    

    然后您可以使用pd.crosstab 并根据需要计算百分比(此处显示了每个Question 每个Gender 每个Answer 的百分比)

    pd.crosstab(df.Question, columns=[df.Gender, df.Answer]).apply(lambda row: row/row.sum(), axis=1)
    
    Gender       0                 1            
    Answer       0     1     2     0     1     2
    Question                                    
    Q1        0.13  0.18  0.18  0.13  0.19  0.19
    Q2        0.09  0.21  0.19  0.22  0.13  0.16
    Q3        0.19  0.10  0.20  0.16  0.18  0.17
    

    详情

    df.head()

      Gender Q1 Q2 Q3
    0      1  0  2  0
    1      1  0  0  1
    2      0  2  0  2
    3      0  0  2  0
    4      0  1  1  1
    

    df.melt().head()

      Gender Question Answer
    0      1       Q1      0
    1      1       Q1      0
    2      0       Q1      2
    3      0       Q1      0
    4      0       Q1      1
    

    【讨论】:

    • 太棒了...非常感谢您的回答。一个快速的问题。我可以分别按男性和女性做答案百分比吗?
    • 我相信如果你改变pd.crosstab函数中的列顺序,你会得到你想要的..columns=[df.Answer, df.Gender]
    • 不..不..那不是我想要的..这改变了交叉表。你得到的交叉表是我想要的,但是百分比是从男性的行总和和女性的行总和分别计算出来的
    • 我觉得和.apply方法有关
    • 行中的前三列必须除以其行总和,接下来的三列也必须除以其行总和..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-06
    • 2021-09-26
    • 2020-12-21
    • 2015-07-18
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多