基於同城同校的推薦--(1)
import mysql.connector
conn=mysql.connector.connect(host='',user='',password='',port='',database='')
#遠端連線
cursor=conn.cursor()
cursor.execute('select * from table')
#執行sql語句操作
t=cursor.fetchall()
#返回讀取的所有行
df=pd.DataFrame(t,columns=[,])
#轉為dataframe
#填充nan法1 udf.loc[np.isnan(df.C),'C']=-1 #dataframe.astype(int)---資料框修改列型別
df=df.fillna(-1)#---------------填充nan法2
cursor.close()#關閉sql連線
data=data.combine_first(df)#df填補data的缺失項
data=pd.merge(data,user_df,on='C')#data與df根據C列,合併,列增多。
https://www.cnblogs.com/bambipai/p/7668811.html
python pd合併資料:
1. pandas.merge和例項方法join實現的是列之間的連線,以DataFrame資料結構為例講解,DataFrame1和DataFrame2必須要在至少一列上內容有重疊,index也好,columns也好,只要是有內容重疊的列即可,指定其中一列或幾列作為連線的鍵,然後按照鍵,索引DataFrame2其他列上的的資料,新增DataFrame1中。通過設定merge引數'on','left_on','right_on'可以指定用來連線的列(即關鍵的重複內容列),也可以將index作為連線鍵,只要傳入left_index=True或right_index=True(或兩個都傳)來說明索引被用作連線鍵。
2. 例項方法join預設通過index來進行連線。
join方法也可以通過列來連線,同樣設定引數‘on’即可。
3. 上面介紹的函式實現的均是列之間的連線,要實現行之間的連線,要使用pd.concat方法。
concat預設在axis=0上工作(沿著負y軸的方向),當設定axis=1時(沿著x軸的方向),它同時也可以實現列之間的連線,產生一個DataFrame。
4. 最後一個例項方法combine_first,它在為資料“打補丁”:用引數物件中的資料為呼叫者物件的缺失資料“打補丁”。
簡單總結來說,通過merge和join合併的資料後資料的列變多,通過concat合併後的資料行列都可以變多(axis=1),而combine_first可以用一個數據填充另一個數據的缺失資料。
recommend_list.py----建立海外使用者的資料框,建立所有有性別有地址資訊的使用者的對列
from sql import city_df #跨模組直接使用sql.py中的變數,但是可能會造成重名。
user=df[(df['C1']>3)|(df['C2']>1)|(df['3']>2)]#多條件篩選
abroad_user=df[(df==-1).astype(int).sum(axis=1)<7]#篩選出df中存在項為-1的,且-1個數小於7個的行(按行進行)
df=df[~(df.C.isin(abroad_user))]#df減去df中列C存在於abroad_user中的行
#按行遍歷df
for index_x in df.index:
if df.loc[index_x,'C']!=-1:
i=df[df['C']==data.loc[index_x,'C']].index#返回符合條件記錄的index
df.loc[index_x,pro]=df.loc[i,'C_P'].values#返回此項的值,並賦值給其他df中的一項
#df中某一項的值必須用df[i,'C'].values顯示
columns_key=('c','a')#dict的key必須是tuple(不可變),不能是list
c_values=(8,2)
columns={columns_key:columns_values}#建立dict
for k,v in columns.items():#遍歷dict:dict.keys()或者dict.values()或者dict.items()
for i in range(7):
if user.values[0][v[i]]!=-1:#某一行user的列值.values[0],具體第幾個值[num]
a=user.values[0][v[i]]
r=list(r[r[k[i]]==a].C.values)#r[k[i]]--根據列名查詢
for rec in r:
r.append(rec)#將查詢的值append進list
list_1=[]#list去重,並保留順序
for i in r:
if i not in list_1:
list_1.append(i)
#去重,不保留順序:
#list(set(list_1))
#或者
#import itertools
#list_1.sort()
#it = itertools.groupby(list_1)
#for k, g in it:
#print k
#dict追加鍵值對dict.setdefault(key,value)
dict={}
dict.setdefault(key,values)
main.py--輸入d,輸出推薦列表
from collections import deque#雙頭對列
import random#隨機
class User(object):#定義calss
def __init__(self,id):
self.id=id
if self.id in dict.keys():#建立對列deque(list)
que=deque(dict.get(self.id))#dict中,根據key值返回對應values值
#對列長度len(deque)
que.extend(r[c])#在佇列尾追加對列
random.sample(list,count)#在一個可迭代物件型別中中隨機選擇count個不重複的值
#class的__call__(self)方法,將方法變為屬性,可以直接呼叫例項,就能執行方法。
def __call__(self):
que.popleft()#從佇列左側彈出
que.insert(index,object)
if __name__=='__main__':
id=input() #input輸入為str
user=User(int(id))
user() #呼叫call