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