【问题标题】:How to create a multiIndex (hierarchical index) dataframe object from another df's column's unique values?如何从另一个 df 列唯一值创建 multiIndex(分层索引)数据框对象?
【发布时间】:2022-01-19 21:30:31
【问题描述】:

我正在尝试创建一个 pandas 多索引数据框,它是每列中唯一值的摘要。

除了创建这个数据框之外,还有更简单的方法来汇总这些信息吗?

无论哪种方式,很高兴知道如何完成这个代码挑战。谢谢你的帮助!这是玩具数据框和我尝试使用带有字典和 value_counts 数据框的 for 循环的解决方案。不确定是否可以在此处以某种方式合并 MultiIndex.from_frame 或 .from_product...

原始数据框:

data = pd.DataFrame({'A': ['case', 'case', 'case', 'case', 'case'], 
                     'B': [2001, 2002, 2003, 2004, 2005], 
                     'C': ['F', 'M', 'F', 'F', 'M'],
                     'D': [0, 0, 0, 1, 0],
                     'E': [1, 0, 1, 0, 1],
                     'F': [1, 1, 0, 0, 0]})


    A       B       C   D   E   F
0   case    2001    F   0   1   1
1   case    2002    M   0   0   1
2   case    2003    F   0   1   0
3   case    2004    F   1   0   0
4   case    2005    M   1   1   0

期望的结果:

     unique  percent
A    case    100 
B    2001    20
     2002    20
     2003    20
     2004    20
     2005    20
C    F       60
     M       40
D    0       80
     1       20
E    0       40
     1       60
F    0       60
     1       40

我的 for 循环尝试失败:

def unique_values(df):
    values = {}
    columns = []
    df = pd.DataFrame(values, columns=columns)
    for col in data:
        df2 = data[col].value_counts(normalize=True)*100
        values = values.update(df2.to_dict)
        columns = columns.append(col*len(df2))
    return df

unique_values(data)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-84-a341284fb859> in <module>
     11 
     12 
---> 13 unique_values(data)

<ipython-input-84-a341284fb859> in unique_values(df)
      5     for col in data:
      6         df2 = data[col].value_counts(normalize=True)*100
----> 7         values = values.update(df2.to_dict)
      8         columns = columns.append(col*len(df2))
      9     return df

TypeError: 'method' object is not iterable

如果有什么明显的我遗漏了,请告诉我!对于 EDA 和 pandas 来说仍然相对较新,任何指针表示赞赏。

【问题讨论】:

    标签: pandas dataframe unique multi-index hierarchical


    【解决方案1】:

    这是.melt 的一个相当简单的应用程序:

    data.melt().reset_index().groupby(['variable', 'value']).count()/len(data)
    

    输出

                    index
    variable value  
    A        case   1.0
    B        2001   0.2
             2002   0.2
             2003   0.2
             2004   0.2
             2005   0.2
    C        F      0.6
             M      0.4
    D        0      0.8
             1      0.2
    E        0      0.4
             1      0.6
    F        0      0.6
             1      0.4
    

    【讨论】:

    • 哇,非常感谢您的及时回复!这完全有效!
    【解决方案2】:

    对不起!我已经写了一个答案,但它是在 javascript 中。我以为我已经点击了 javascript 并开始编码后来到这里,但在发布时我看到你正在用 python 编码。

    无论如何我都会发布它,也许它会对你有所帮助。 Python 与 javascript 并没有太大区别 ;-)

    const data = {
        A: ["case", "case", "case", "case", "case"],
        B: [2001, 2002, 2003, 2004, 2005],
        C: ["F", "M", "F", "F", "M"],
        D: [0, 0, 0, 1, 0],
        E: [1, 0, 1, 0, 1],
        F: [1, 1, 0, 0, 0]
    };
    
    const getUniqueStats = (_data) => {
        const results = [];
        for (let row in _data) {
            // create list of unique values
            const s = [...new Set(_data[row])]; 
            // filter for unique values and count them for percentage, then push
            results.push({ index: row, values: s.map((x) => ({ unique: x, percentage: (_data[row].filter((y) => y === x).length / data[row].length) * 100 })) });
        }
        return results;
    };
    
    const results = getUniqueStats(data);
    
    results.forEach((row) =>
        row.values.forEach((value) =>
            console.log(`${row.index}\t${value.unique}\t${value.percentage}%`)
        )
    );
    

    【讨论】:

      猜你喜欢
      • 2021-06-15
      • 1970-01-01
      • 2017-06-26
      • 2023-02-23
      • 2021-01-22
      • 2020-05-17
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多