pandas 常用方法使用示例
将 dataframe 列中的 json 拆分为多个列 import json df = DataFrame([{'S_DATA':'{"age":11,"score":12}'}]) df['S_DATA'] = df['S_DATA'].apply(lambda x: json.loads(x)) print(pd.json_normalize(df.S_DATA))
from pandas import DataFrame import numpy as np import pandas as pd t={ "age": [18, 30, np.nan, 40, np.nan, 30], "city": ["BeiJing", "ShangHai", "GuangZhou", "ShenZhen", 'BeiJing', "ShangHai"], "sex": [None, "male", "female", "male", np.nan, "unknown"], "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"], "score":[11,7,33,44,22,33], "naem":['sdf','aa','bb','tt','ere','tt'], "name":['sdf 11','aa 22','bb 33','tt 44','ere 55','tt 66'] } df =DataFrame(t) cc=df.isnull().sum() #每列none的个数,不是count(),count()求出来的值不对呦 print(df[df.age.notnull()]) # isnull() df.dropna() #删除none所在行 df1=df['score'] df1.index=['a','b','c','d','e','f'] # 为series定义新的索引 df1.name='aiyou' print(df1[df1<22]) # 对 series 进行过滤 print(df1[['a','c']]) # 获取两个元素 print((df1[:3])) # 对series切片 print((df1+2)) # series 给每个元素加2 print(df1.to_frame()) #series 变成 dataframe print(df1['a']) # 可以将series当做dict使用,series的index就是dict的key print(df.loc[[1,2],['age']]) # 查询指定的行和列 # 访问行用loc 或 iloc print(df[(df.age>0)&(df.age<40)]) print(df[(df.age>0)&(df.age<40)][['age']])# 查询特定的行和列 print(df.count()) # 非空的个数 print(df.sum()) # 非空的个数
del df['naem'] #删除一列 print(df.pop('naem')) # 删除一列,返回值是删除的这列,原来的df发生了变化 print(df.drop('age',axis=1))# 删除一列,返回值是后的结果,原来的df没发生变化 print(df[['age','score']]) # print(s6+s7) s6和s7是两个series,s6中不存在g索引,s7中不存在e索引,所以数据运算会产生两个缺失值NaN clonedf=df.assign(age_add_one = df["age"] + 1) #在克隆df的同时再加上一列 如果想要保证原有的 DataFrame 不改变的话,我们可以通过 assign 方法来创建新的一列 print(clonedf) df['age_code']= np.where(df["age"] >22, 1, 0) # 根据某列的值,产生新的一列 df['age']=np.where(df['age']<df['score'],df['score'],df['age']) print(type(df[['age']])) # DataFram print(type(df['age'])) # Series print(df.shape) print(df.head(2)) # 查看前两行数据 print(df.tail(2)) print(df['age'].value_counts()) # 获取某列中每个值出现的次数 print(df.sort_index(ascending=False)) # 按索引排序 print(df.sort_values(by=['age','age_code'])) #按值排序 print(df['age'].idxmax()) #获取最大值的索引 print(df['age'].idxmin()) # 获取最小值的索引 ''' map 是 Series 中特有的方法,通过它可以对 Series 中的每个元素实现转换 apply 方法既支持 Series,也支持 DataFrame,在对 Series 操作时会作用到每个值上,在对 DataFrame 操作时会作用到整行或整列(通过 axis 参数控制)。 applymap 方法针对于 DataFrame,它作用于 DataFrame 中的每个元素,它对 DataFrame 的效果类似于 apply 对 Series 的效果 ''' df['age'] = df['age'].combine_first(df['score']) # 利用另一列的值填补此列的None print(df.rename(index={1: "tom", 3: "bob"})) #修改索引 print(df.rename(columns={"age": "Age", "city": "City", "sex": "Sex"})) #修改列名 print(df["age"].astype(float)) # 转换数据类型 print(pd.to_numeric(df.age, errors="ignore")) # errors='raise',这意味着强转失败后直接抛出异常,设置 errors='coerce' 可以在强转失败时将有问题的元素赋值为 pd.NaT(对于datetime和timedelta)或 np.nan(数字)。设置 errors='ignore' 可以在强转失败时返回原有的数据 print(df.age.nlargest(2)) # 获取最大的n个值或最小值的n个值,我们可以使用 nlargest 和 nsmallest 方法来完成,这比先进行排序,再使用 head(n) 方法快得多 df["birth"] = pd.to_datetime(df.birth) # 把数据类型转成时间 print(df.city.str.upper()) # print(df.city.str.len()) user_info.city.str.replace(" ", "_") str 方法的使用 print(df.name.str.split(' ').str.get(1)) # 对字段进行分割
df["total"] = df['total'].astype(str).str.split('.').str.get(0) #将Timestamp类型的转成str类型,然后再split,再get
df[['name1','name2']]=df.name.str.split(' ', expand=True) # 根据一列生成两列
print(df[df.city.str.contains("Zh")]) # 是否包含某个关键字
print(df.dropna(axis=0, how="any", subset=["city", "sex"])) # thresh=3,会在一行/列中至少有 3 个非空值时将其保留。
df.age.fillna(0)
print(df.replace({"age": 40, "birth": pd.Timestamp("1978-08-08")}, np.nan)) # 将age列为40的替换成nan,将birth列为1978-08-08的替换成nan
print(df.city.replace(r'\s+', np.nan, regex=True))
一列变多列
df = pd.DataFrame({'列1':['a','b','c'],'列2':[[10,20], [20,30], [30,40]]}) df_new = df.列2.apply(pd.Series)
窗口函数:
df2.rolling(window=2, on="date", min_periods=1).sum() #计算每两条记录的和
df2.expanding(min_periods=1)["turnover"].sum() #累加和的计算,turnover为列名
df2.rolling(window=2, min_periods=1)["turnover"].agg([np.sum, np.mean]) #同时计算出多个统计值用agg
转换时区:
ts=pd.date_range("2018-6-26 07:00:00", periods=8)
print(ts)
ts_utc = ts.tz_localize('UTC')
print(ts_utc)
ts_ea=ts_utc.tz_convert('US/Eastern')
print(ts_ea)