我可以使用group by来获取文档的总体中位数,例如“ print(df.groupby(['Key'])。median())”。但是我想学习逐行执行此操作的适当方法,并查看上述小组是否已更改。下面是一种非常笨拙且非Python的方法。
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
我得到与分组依据相同的东西,保留了一些舍入错误。但是我想以最简洁,pythonic的方式做到这一点,可能使用列表理解。
答案 0 :(得分:1)
关于更多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的verry first值,对吧?
如果要获取数据帧的长度,则可以使用:
rows, cols= df.shape
而不是打电话给len。我认为对代码的读者来说,它的作用更加明显。