pandas 筛选
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,44], "naem":['sdf','aa','bb','tt','ere','tt'], "name":['sdf 11','aa 22','bb 33','tt 44','ere 55','tt 66'] } df =DataFrame(t) index = pd.Index(data=["Tom", "Bob", "Mary", "James", "Andy", "Alice"], name="name") data = { "age": [18, 30, np.nan, 40, np.nan, 30], "city": ["Bei Jing ", "Shang Hai ", "Guang Zhou", "Shen Zhen", np.nan, " "], "income": [None, 11, 22,33, np.nan, 55], "sex": [None, "male", "female", "male", np.nan, "unknown"], "birth": ["2000-02-10", "1988-10-17", None, "1978-08-08", np.nan, "1988-10-17"] } df = pd.DataFrame(data=data, index=index) print(df.get('age1') ) #使用get,没有此列也不会报错 print(df.get('age').get(1)) # 索引到具体的单元格
print(df['age'][1]) #索引到具体的单元格 print(df[::2]) #每两行筛选 一次数据 print(df[::-1]) #行逆序 print(df['age']) #筛选单列 print(df[['age','sex']]) #筛选多列 print(df.iloc[0]) #筛选第一行 print(df.iloc[1, 0]) #筛选出单元格 第二行第一列的数据 print(df.iloc[[1, 0, 2], 0]) # 筛选出多行一列 第二行、第一行、第三行对应的第一列的数据 print(df.iloc[0:3, 0:2]) #切片,多行多列 print(df.loc["Tom": "Mary"]) #多行 print(df.loc[:, "age": "birth"]) # 多列 # loc与iloc的区别: 通过名称来筛选时,传入的切片是左右都包含的 print(df[~(df.sex == 'unknown')]) #取反 print(df.loc[df.age > 20, ["age"]]) # 通过loc进行逻辑筛选 print(df[df.sex.isin(["male", "female"])]) # 对几个常量进行筛选 print(df[df.index.isin(["Bob"])]) # 索引也可以用 isin print(df[lambda x: x["age"] > 20]) #通过函数进行筛选,必须是带有一个参数 print(df.loc[lambda x: x.age > 20, lambda x: ["age"]]) # ============ user_info=df grouped = user_info.groupby(["sex", "age"]) # user_info.groupby(["sex", "age"], sort=False) groupby 会在操作过程中对数据进行排序。如果为了更好的性能,可以设置 sort=False print(grouped.groups) for name, group in grouped: # 遍历分组,如果是根据多个字段来分组的,每个组的名称是一个元组 print("name: {}".format(name)) print("group: {}".format(group)) user_info.groupby(["sex", "age"]).get_group(("male", 30)) # 选择一个分组用 get_group rs=grouped["age"].agg(np.max) # 对分组后的某一列进行统计 # 如果是根据多个键来进行聚合,默认情况下得到的结果是一个多层索引结构。可以设置参数 as_index=False 避免多层索引 # 对已经有多层索引的对象可以通过reset_index ,去掉多层索引 rs.reset_index() grouped["income"].agg([np.sum, np.mean]).rename(columns={"sum": "income_sum", "mean": "income_mean"}) #一次进行多个聚合操作,并重命名统计结果 grouped.agg({"age": np.mean, "income": np.sum}) # 不同列进行不同的聚合操作 # 使用apply,通过带参数的函数对列进行处理 def f1(ser, num=2): return ser.nlargest(num).tolist() # print(grouped["income"].apply(f1)) # 前面进行聚合运算的时候,得到的结果是一个以分组名作为索引的结果对象。虽然可以指定 as_index=False ,但是得到的索引也并不是元数据的索引。 # 如果我们想使用原数组的索引的话,可以使用transform grouped = user_info.groupby("sex") print(grouped["income"].transform(np.mean)) print(user_info.to_json()) #将dataframe转成json字符串 data1 = { "name": ["Tom", "Bob"], "age": [18, 30], "city": ["Bei Jing ", "Shang Hai "] } df1 = pd.DataFrame(data=data1) data2 = { "name": ["Mary", "James"], "age": [35, 18], "city": ["Guang Zhou", "Shen Zhen"] } df2 = pd.DataFrame(data=data2) # append和concat实现的功能差不多 print(df1.append(df2,ignore_index=True)) #ignore_index=True 是为了重新生成索引 print(pd.concat([df1,df2],ignore_index=True)) data2 = {"name": ["Bob", "Mary", "James", "Andy"], "sex": ["male", "female", "male", np.nan], "income": [8000, 8000, 4000, 6000] } df2 = pd.DataFrame(data=data2) #join和merge功能差不多 print(pd.merge(df1, df2, on="name", how="outer")) #outer inner left right print(df1.join(df2.set_index("name"),on="name",how='outer')) # 两个 DataFrame 中需要关联的键的名称不一样,可以通过 left_on 和 right_on 来分别设置 pd.merge(df1, df2, left_on="name1", right_on="name2") # 两个DataFrame中都包含相同名称的字段时,可以设置参数 suffixes,默认 suffixes=('_x', '_y') 表示将相同名称的左边的DataFrame的字段名加上后缀 _x,右边加上后缀 _y