python 杂记

杂记

pandas实现SQL的innot in

import pandas as pd

df = pd.DataFrame({'id':['3000','4001','4002','3005']})
ids = ['4001','4002']

# 方式一
df[df.id.isin(ids)]
df[~df.id.isin(ids)]

# 方式二
df.query("id in @ids")
df.query("id not in @ids")

pandas 实现 startswith

# 方式一
df[df.id.startswith("4")]
df[~df.id.startswith("4")]

# 方式二
df.query('id.startswith("4")', engine='python')
df.query('id.startswith("4")', engine='python')

爬虫问题

xpath语法

文本等于:/span[text()='确定']

文本不等于:/span[text()!='确定']

不包括文本:/span[not(text())]

不包括属性:/span[not(@class)]

不包括属性:/span[not(contains(@class,'expire'))]

包括属性:/span[contains(@class,'expire')]

selenium执行js脚本

js = "var q=document.getElementById('listdropdownUnitIdInfo-table').scrollTop=1000"
driver.execute_script(js)

上面的js脚本是,找到id为listdropdownUnitIdInfo-table 的元素,向下滚动1000个像素。可用于不规则的下拉选择框

driver.execute_script('document.querySelector("#mini-27 > span > input").click()')

此js脚本是,根据select定位找到的元素,点击一下。

driver.execute_script("dat=document.getElementById('train_date'); dat.removeAttribute('readonly')")
driver.execute_script("document.getElementById('train_date').value='2020-10-01'")

此外还可以移除属性和修改属性。

selenium下拉选择框

from selenium.webdriver.support.select import Select

s = driver.find_element_by_xpath('//li[@class="select"]/select')
Select(s).select_by_value('100')

先将select的元素定位,注意:一定要定位到select。然后使用**Select().select_by_value(‘100’)**选择元素。

便捷使用xpath/js/select定位元素

F12进入开发者模式,在chrome/FireFox中,点击想要定位的元素,右键复制,点击想要的语法,即可。

处理数据问题

处理时间问题

import time

day = int(time.strftime("%d", time.localtime()))  # 日
month = int(time.strftime("%m", time.localtime())) #月
year = int(time.strftime("%Y", time.localtime())) # 年

有关于日期的代码,一定要注意跨月/年的日期,多考虑一点,多测试

xlwings保存数据

app = xw.App(visible=False, add_book=False)
wb = app.books.open(文件路径)
sheet = wb.sheets[工作薄名]
sheet.range("a2").options(index=False, header=False).value = df
# df是一个DataFrame格式的数据

wb.save()
wb.close()
app.quit()

将两个列表合成一个二维列表

  1. 列表生成式
c = [[a[_], b[_]] for _ in range(len(qgzx))]

  1. zip压缩
list(zip(a,b))

# [(1, 4), (2, 5), (3, 6)]

pandas筛选多个

一般的筛选只需要,s[s[0] == 1],但是当需要筛选的对象有多个时,就有点麻烦,可以将每一个元素都进行一次筛选。也可以

s[list(map(lambda x: x not in list, s[0]))]

pandas连接数据

按行加,将数据纵向连接,使用pd.concat([])时,注意列名对应,需要时,可以将列名修改为想要的名字和顺序。

# 修改列名
s1.columns = [0, 1, 2, 3, 4, 5, 6, 7]
# 重新排序
ss = ss.reindex(columns=[0, 1, 2, 3, 4, 5, 6])

s = pd.concat([s1, s2])

按列加,将数据横向连接,使用pd.merge()时,需要确定按照那一列进行,对应连接。连接参数有onleft_onright_onleft_indexright_indexleft_indexright_index等等。

# 按照索引连接
pd.merge(s4, s5, right_index=True, left_index=True)

你可能感兴趣的:(Python,python,开发语言,后端)