【问题标题】:Making a matrix-format from python从python制作矩阵格式
【发布时间】:2021-02-25 04:35:52
【问题描述】:

我的数据框 B 中有以下数据:

F1     F2    Count
A      C      5
B      C      2
B      U      6
C      A      1

我想用它们制作一个方阵,所以结果是:

    A    B   C  U
A   0    0   6  0
B   0    0   2  6
C   6    2   0  0
U   0    6   0  0

我最初使用pd.crosstab(),但矩阵中缺少 F1/F2 中的一些变量。

AC = 5 CA = 1 因此输出应该是 6。

还有pdcrosstab() 不识别BU = UB

谁能帮忙?我基本上是 python 新手。

顺便说一句,这是我的代码:

wow=pd.crosstab(B.F1, 
            B.F2, 
            values=B.Count, 
            aggfunc='sum',
            ).rename_axis(None).rename_axis(None, axis=1)

【问题讨论】:

    标签: python pandas numpy matrix crosstab


    【解决方案1】:

    你可以pd.concatwowwow.T然后groupby索引和sum再次:

    >>> wow=pd.crosstab(B.F1, 
                B.F2, 
                values=B.Count, 
                aggfunc='sum',
                ).rename_axis(None).rename_axis(None, axis=1)
    >>> wow
         A    C    U
    A  NaN  5.0  NaN
    B  NaN  2.0  6.0
    C  1.0  NaN  NaN
    
    >>> pd.concat([wow, wow.T], sort=True).fillna(0, downcast='infer').groupby(level=0).sum()
       A  B  C  U
    A  0  0  6  0
    B  0  0  2  6
    C  6  2  0  0
    U  0  6  0  0
    

    【讨论】:

    • 将最后一行添加到我的初始代码中有效!谢谢!
    【解决方案2】:

    您可以将列 F1F2 分类并使用 crosstab 进行工作。

    FDtype = pd.CategoricalDtype(list("ABCU"))
    
    df[["F1", "F2"]] = df[["F1", "F2"]].astype(FDtype)
    count = pd.crosstab(df["F1"], df["F2"], df["Count"], aggfunc='sum', dropna=False)
    count.fillna(0, inplace=True, downcast="infer")
    count += count.T
    

    备注:在构建DataFrame时指定列dtypes更有效

    【讨论】:

      【解决方案3】:

      您可以在 'F1''F2' 被交换到原始 DataFrame 的位置附加 DataFrame。

      df1 = df.append(df.rename({'F1': 'F2', 'F2': 'F1'}, axis=1), sort=False)
      

      那么你可以使用pivot_table:

      pd.pivot_table(df1, values='Count', index='F1', columns='F2', aggfunc='sum', fill_value=0)
      

      crosstab:

      pd.crosstab(df1.F1, df1.F2, df1.Count, aggfunc='sum').fillna(0)
      

      最后删除列和索引名称:

      del df1.columns.name, df1.index.name
      

      结果:

         A  B  C  U
      A  0  0  6  0
      B  0  0  2  6
      C  6  2  0  0
      U  0  6  0  0
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-08-30
        • 2018-09-15
        • 1970-01-01
        • 2013-10-05
        相关资源
        最近更新 更多