python - 如何逐行获得中位数?
问题描述
我可以使用 group by 来获取文档的整体中位数,例如“print(df.groupby(['Key']).median())”。但我想逐行学习适当的方法,看看上述组是否发生了变化。下面是一种非常笨拙且非pythonic的方法。
CSV:
A,1
A,2
A,3
A,4
A,5
A,6
A,7
B,8
B,9
B,10
B,11
B,12
B,13
B,14
B,15
B,16
B,17
import pandas as pd
import numpy as np
import statistics
df = pd.read_csv(r"C:\Users\mmcgown\Downloads\PythonMedianTest.csv",names=['Key','Values'])
rows = len(df.iloc[:,0])
i=0
med=[]
while i < rows:
if i == 0 or df.iloc[(i-1,0)]==df.iloc[(i,0)]:
med.append(df.iloc[i,1])
if i==(rows-1):
print(f"The median of {df.iloc[(i,0)]} is {statistics.median(med)}")
elif df.iloc[(i-1,0)]!=df.iloc[(i,0)]:
print(f"The median of {df.iloc[(i-1,0)]} is {statistics.median(med)}")
med = []
i += 1
输出:
The median of A is 4
The median of B is 13
我得到与 group by 相同的东西,保存一些舍入错误。但我想以最简洁、pythonic 的方式来做,可能使用列表理解。
解决方案
一个更 Pythonic 版本的提案可能如下所示:
med=[]
rows, cols= df.shape
last_group=None
group_field='Key'
med_field='Values'
for i, row in df.iterrows():
if last_group is None or last_group == row[group_field]:
med.append(row[med_field])
else:
print(f"The median of {last_group} is {statistics.median(med)}")
med = [row[med_field]]
last_group= row[group_field]
if med:
print(f"The median of {last_group} is {statistics.median(med)}")
我试图避免使用不太容易阅读的索引的 iloc 调用。起初,老实说,我不明白你在比较什么。在您的情况下,您也不需要 elif 。您可以只使用 else,因为您的条件只是 if 子句的一部分的否定。然后我发现你的版本计算的中位数和我的计算的中位数不同。如果我在这里没记错的话,你会丢弃 B 的第一个值,对吧?
如果你想得到一个数据框的长度,你可以使用:
rows, cols= df.shape
而不是调用 len。我认为这对代码的读者来说更明显,它做了什么。
推荐阅读
- optimization - 如何减少二进制变量整数线性规划的总和
- c# - 如何在 ASP.NET Core 的 Startup.cs 中注册 RoleManager
- r - ggplot - 面板边框交替黑白矩形
- apache-kafka - 如何使用kafka和faust检查是否在给定时间段内发送了新记录
- django - Django将对象传递给新模板
- jenkins - OWASP ZAP 无法测试 API
- database - PHPSpreadsheet - 如何从 PHPSpreadsheet 创建一个 zip 文件?
- android - 选择 Android 库的构建变体的 Gradle 脚本
- sql - 插入覆盖目录的问题
- ios - Swift curl --用户帖子