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