【问题标题】:Trying to pass numpy array mode value to df column试图将 numpy 数组模式值传递给 df 列
【发布时间】:2021-01-07 23:16:06
【问题描述】:

我创建了一个小程序来查找 df 的两个特定列的平均值、中值和众数。我使用 np.mean 和 np.median 来查找平均值和中值,但是对于模式,我从 df 创建了一个 numpy 数组并计算了模式。我将它们打印到控制台并且值看起来不错,但是我想从 numpy 数组中获取模式值以显示在我的 df 中,该 df 有四列分别表示“学生”、“分数”、“平均值”和“中位数”。我想知道是否有办法获取模式值并附加到 df 的末尾以使第五列标题为“模式”。我的代码如下所示。我也不想为此使用 scipy 之类的库,以便在有其他方法时不使用 sparse。

def mean_median():
    df = pd.read_csv('Surveys.csv')

    dfm= df.groupby("STUDENT")[["SCORE"]].agg([np.mean, np.median]).reset_index()

    print(dfm)


    arr = dfm.to_numpy()

    print('\nNumpy Array\n----------\n', arr)
    vals,counts = np.unique(arr, return_counts=True)
    index = np.argmax(counts)
    return vals[index]

这是我的输出示例,如果它有助于使事情更清晰易懂

    STUDENT      SCORE       
                mean      median
0      2443.0  93.210145   94.0
1      2445.0  94.652113   95.0
2      2447.0  93.919775   95.0
3      2451.0  95.203571   95.0
4      2832.0  94.544304   95.0
..        ...        ...    ...
276   27323.0  95.585106   96.0
277   27324.0  94.562105   95.0
278   27325.0  96.986348   98.0
279   27326.0  96.809524   97.0
280   27334.0  96.102564   97.0

[281 rows x 3 columns]

Numpy Array
----------
 [[ 2443.            93.21014493    94.        ]
 [ 2445.            94.65211268    95.        ]
 [ 2447.            93.91977481    95.        ]
 [ 2451.            95.20357143    95.        ]
 [ 2832.            94.5443038     95.        ]
 [ 2838.            94.97988265    95.        ]
 [ 2839.            93.88054608    94.        ]
 [ 2841.            93.90789474    94.        ]
 [ 2980.            94.14044944    95.        ]
 [ 3220.            94.44219067    95.        ]
 [ 3221.            93.80825959    94.        ]
 [ 3222.            93.88416076    94.        ]
 [ 3229.            98.42857143   100.        ]
 [ 3231.            92.11363636    93.        ]
 [ 3236.            94.3677686     95.        ]
 [ 3238.            93.84027778    94.        ]
 [ 3332.            93.12958963    94.        ]
 [ 3333.            92.83663366    93.5       ]

从几行中采样输入数据以尝试重新创建

 STUDENT        SCORE
 
  25718         97            
  25719         97             
  26990         95           
  23809         92          
  24032         90            
  22723         87            
  24688         92           
  25714         89            
  25718         78            
  23078         90            
  25713         90
  24032         87
  26990         77
  26990         89

【问题讨论】:

  • 请提供可重现的输入数据样本,以便我们了解您所指的内容。
  • 如果有帮助,我用当前输出更新了帖子
  • 请同时添加几行输入。
  • 抱歉我没关注你?哪个输入数据?
  • 请查看How to Ask。它期望在提出问题时提供最小的可重复输入。在这种情况下,df 来自 'Surveys.csv'。这将有助于某人复制您的情况并让他们快速解决您的问题。

标签: python pandas numpy


【解决方案1】:

您可以使用pd.Series.mode 进行计算模式。此外,对于均值和中位数,您可以简单地使用字符串来引用函数。

#Dummy dataframe
d = {'STUDENT': [25718, 25718, 25718, 25718, 25718, 22723, 22723, 22723, 22723, 22723, 25713, 25713, 25713], 
     'SCORE': [97, 97, 95, 92, 90, 87, 92, 89, 78, 92, 90, 87, 87]}

df = pd.DataFrame(d)
out = df.groupby("STUDENT")["SCORE"].agg(['mean','median',pd.Series.mode]).reset_index()
print(out)
   STUDENT  mean  median  mode
0    22723  87.6      89    92
1    25713  88.0      87    87
2    25718  94.2      95    97

如果存在模式(每个学生至少有一个重复值),这将给出结果。如果没有模式,则会抛出错误。

更多详情here.


如果您不确定每个学生是否有定义的模式,您可以简单地取pd.Series.mode 返回的模式值的平均值。如果它返回一个模式,它的平均值是相同的。如果它返回多种模式,则返回这些模式的平均值。

d = {'STUDENT': [25718, 25718, 25718, 25718, 25718, 22723, 22723, 22723, 22723, 22723, 25713, 25713, 25713], 
     'SCORE': [97, 97, 95, 92, 90, 87, 92, 89, 78, 92, 90, 87, 88]}

mode = lambda x: pd.Series.mean(pd.Series.mode(x))

df = pd.DataFrame(d)
out = df.groupby("STUDENT")["SCORE"].agg(['mean','median', mode]).reset_index()
out.columns = ['STUDENT','mean','median','mode']
print(out)
   STUDENT       mean  median       mode
0    22723  87.600000      89  92.000000
1    25713  88.333333      88  88.333333
2    25718  94.200000      95  97.000000

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多