我在不规则数量的列中有一系列数据,我需要使用 Pandas 从跨多列的拆分部分中确定最常见的值。我的意思的一个例子是,如果我有关于我的同事每天午餐吃什么样的奶酪的信息:

Idx Name   Cheese1   Cheese2   Cheese3
0   Evan   Gouda     NaN       NaN
1   John   Cheddar   Havarti   Blue
2   Evan   Cheddar   Gouda     NaN
3   John   Havarti   Swiss     NaN

我正在寻找某种能够提供结果数据透视表的功能:
Name    Cheese    Pct
Evan    Gouda     .66
John    Havarti   .4

我也不知道每次运行脚本时需要包含多少列,只知道它们都是“奶酪”+索引的格式。如果约翰第二天带着四个奶酪出现,我将需要添加第四列,并且分析脚本需要能够处理它。

最佳答案

import io
import pandas as pd

data = io.StringIO("""\
Idx Name   Cheese1   Cheese2   Cheese3
0   Evan   Gouda     NaN       NaN
1   John   Cheddar   Havarti   Blue
2   Evan   Cheddar   Gouda     NaN
3   John   Havarti   Swiss     NaN
4   Rick   NaN       NaN       NaN
""")
df = pd.read_csv(data, delim_whitespace=True)

def top_cheese(g):
    cheese_cols = [col for col in g.columns if col.startswith('Cheese')]
    try:
        out = (g[cheese_cols].stack().value_counts(normalize=True)
                             .reset_index().iloc[0])
        out.index = ['Cheese', 'Pct']
        return out
    except IndexError:
        return pd.Series({'Cheese': 'None', 'Pct': 0})


output = df.groupby('Name').apply(top_cheese)
print(output)

输出:
       Cheese       Pct
Name
Evan    Gouda  0.666667
John  Havarti  0.400000
Rick     None  0.000000

关于python - Pandas 中多列的最常见值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38357461/

10-12 22:06