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

2024-04-25 01:29:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我创建了一个小程序,用于查找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

Tags: 方法numpydfindexnp模式数组mean
1条回答
网友
1楼 · 发布于 2024-04-25 01:29:37

您可以使用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)
   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

相关问题 更多 >