如何从另一个 df 列的唯一值创建 multiIndex(分层索引)数据框对象?

How to create a multiIndex (hierarchical index) dataframe object from another df's column's unique values?

我正在尝试创建一个 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

我的循环尝试失败:

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 来说还比较陌生,任何指点都值得赞赏。

这是 .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

对不起!我已经写了一个答案,但它在 javascript 中。我是在点击 javascript 并开始编码后来到这里的,但是在 posting 上我看到你在 python.

中编码

我会post无论如何,也许它会帮助你。 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}%`)
    )
);