Python 试图将numpy数组模式值传递给df列

Python 试图将numpy数组模式值传递给df列,python,pandas,numpy,Python,Pandas,Numpy,我创建了一个小程序,用于查找df的两个特定列的平均值、中值和模式值。我使用np.mean和np.median来查找平均值和中值,但对于模式,我从df创建了一个numpy数组并计算了模式。我将它们打印到控制台,这些值看起来很好,但是我想从numpy数组中获取模式值,以显示在我的df中,该df有四列,分别为“学生”、“分数”、“平均值”和“中值”。我想知道是否有一种方法可以获得模式值并附加到df的末尾,从而有一个标题为“模式”的第五列。下面是我的代码,请看一看。我不想为此使用像scipy这样的库,以

我创建了一个小程序,用于查找df的两个特定列的平均值、中值和模式值。我使用np.mean和np.median来查找平均值和中值,但对于模式,我从df创建了一个numpy数组并计算了模式。我将它们打印到控制台,这些值看起来很好,但是我想从numpy数组中获取模式值,以显示在我的df中,该df有四列,分别为“学生”、“分数”、“平均值”和“中值”。我想知道是否有一种方法可以获得模式值并附加到df的末尾,从而有一个标题为“模式”的第五列。下面是我的代码,请看一看。我不想为此使用像scipy这样的库,以便在有其他方法的情况下不使用稀疏

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

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

#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)
如果存在模式(每个学生至少有一个重复值),将给出结果。如果没有模式,它将抛出错误。

更多细节


如果您不确定每个学生是否都有一个已定义的模式,您可以简单地取
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)

请提供一个可复制的输入数据样本,以便我们了解您所指的内容。如果这有助于添加几行输入,我会使用当前输出更新帖子。对不起,我没有跟踪您?哪些输入数据?请检查。当你提出一个问题时,你应该提供最小的可复制输入。在本例中,
df
来自
'Surveys.csv'
。这将有助于有人复制你的情况,让他们快速解决你的问题。
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