先附上文件:
https://ply.lanzoui.com/ipRH4sctyle
处理要求:
model中有重复的名字,对应的year是递增的。
需要修改第一次出现的model对应的year为year最小-year最大
思考方向:
一开始我是从行开始处理的,因为要求修改指定的行,其他不能修改!我tm也是第一次碰到这种变态的要求,但没想到这个方向处理起来无比困难。难点在于以下几点:
1.要保证model的名字要一致,虽然是递增的规律,如果单独处理year难免会遇到刚刚好递增的时候。
2.其他行不能删除,行遍历很难形成判定条件
3.这次实践没有任何回报!
后面,我重新做了一下思考
单纯的获取最开始重复的行索引和最后的行索引,马上就可以确定year的最小和最大值了
之后,就直接处理开始重复时的最早的索引,对指定的进行修改就行了!
难点就在于用循环获取需要修改的索引时候,要有一个对应获取最大值的一个函数。
代码:
按照常规操作,我们读取这个文件
df = pd.read_excel('hh.xlsx')
df.head()
我们将分批讲解!
x = df
model = x['model']
make = df['make']
makex=make.copy()
modelx = model.copy()
year = x['year']
yearx = year.copy()
m1 = modelx.drop_duplicates(keep='first')
m2 = modelx.drop_duplicates(keep='last')
在这里,我要说明的是,这复杂的copy是为了避免那个人的。。要求,如果没有copy操作,会打印出警告,但不影响结果。
获取了model和year,make这里是需要获取的,最后拼接用,这个获取就行。。对新手好康一点
m1和m2分别是model最开始重复的索引和最后重复的索引
def min(i):
ymin = yearx[i]
return str(ymin)
def max(i):
l = []
maxl = []
for k in m1.index:
l.append(k)
for j in m2.index:
maxl.append(j)
ymax = yearx[maxl[l.index(i)]]
return str(ymax)
这里是获取最小的year和最大的year后面要做拼接处理!
我知道写的很low,但是写法对小白,新手来说,可读性还是可观的。
for i in m1.index:
yearx[i] = min(i)+"-"+max(i)
r = pd.concat([makex,modelx,yearx],axis=1)
r.head()
print("处理完成")
因为只需要修改最小的重复时候的行的year值,我们对m1进行遍历,通过min和max获取了最大和最小值
进行修改,之后拼接,完成了处理。
保存:
r.to_csv('87.csv')
print("处理完成")
我想说:
这个提出该要求的人我也不知道脑子咋想的,为啥不去直接删去重复的内容,合并最小-最大呢?
所以我在这里放出了代码。。。。
max和min还是用的到的
import pandas as pd
df = pd.read_excel('hh.xlsx')
df.head()
import pandas as pd
df = pd.read_excel('hh.xlsx')
model = df['model']
make = df['make']
year = df['year']
yearx = year.copy()
m1 = model.drop_duplicates(keep='first')
m2 = model.drop_duplicates(keep='last')
make = make.drop_duplicates(keep = 'first')
yearlist = []
for i in m1.index:
yearlist.append(min(i)+"-"+max(i))
yearlist = pd.DataFrame(yearlist)
r = pd.concat([m1.reset_index()['model'],yearlist],axis=1)
r.to_csv('87.csv')
print("处理完成")