# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np
# DataFrame初始化 numpy.ndarray
df = pd.DataFrame(np.arange(12).reshape(3, 4), columns=["col" + str(i) for i in range(4)], index=list("ABC"))
print(df)
# DataFrame初始化 字典 ,值个数必须一致,其中键做为列名
dic = {"name": ["xiaoming", "xiaohong"], "age": [18, 20], "sex": ["M", "F"]}
df = pd.DataFrame(dic)
print(df)
# DataFrame初始化 列表,缺省值为NaN,列名为字典key
dic = [{"name": "xiaoming", "age": 18, "sex": "F"}, {"name": "xiaohong", "age": 20}]
df = pd.DataFrame(dic)
print(df)
print(df.index) # RangeIndex(start=0, stop=2, step=1)
print(df.columns) # Index(['name', 'age', 'sex'], dtype='object')
print(df.values)
print(df.dtypes) # name object / age int64 /sex object
print(df.shape) # (2, 3)
print(type(df.values)) # <class 'numpy.ndarray'>
print(df.ndim) # 表示维度 2
print(df.head()) # 默认前5行
print(df.tail()) # 默认后5行
print("*" * 50)
print(df.info()) # 相关信息概述
print(df.describe()) # 计算数字类型的字段的指标
# 排序
df = df.sort_values(by="age", ascending=False)
print(df)
'''
df = pd.read_csv("test.csv")
print(type(df)) # <class 'pandas.core.frame.DataFrame'>
print(df)
'''
# DataFrame 切片
df = pd.DataFrame(np.random.randint(10, 100, (6, 6)))
df.columns = ["col" + str(i) for i in range(6)]
print(df)
print(df["col1"]) # 取列 pandas.core.series.Series
print(df[:3]) # 取行 pandas.core.frame.DataFrame
# 同时取行取列
print(df[:3][["col1", "col2"]])
print("*" * 50)
# loc 通过标签索引获取数据
print(df.loc[0, "col1"])
print(df.loc[[0, 2], ["col1", "col3"]])
print(df.loc[0:2, ["col1", "col3"]]) # 注意:行中冒号后面的也是能选到的,前闭后闭
# iloc 通过位置坐标获取数据
print(df.iloc[1, 1])
print(df.iloc[1:3, 2:3]) # 注意:行中冒号后面的不能选到的,前闭后开
# 数据过滤
print(df[df["col1"] > 50]) # 布尔索引 返回满足条件的行列数据
df[(df["col1"] > 50) & (df["col1"] < 80)] # 多条件用括号,&链接
# 转换成字符串
df.iloc[:, 1] = "a/b/c"
df["col1"].str.split("/")
# NaN处理
df.iloc[3, 4] = np.nan
pd.isnull(df)
print(df[pd.notnull(df["col4"])]) # col4中不为NaN的数据
df.dropna(axis=0, how="any") # 删除存在有NaN的行
df.dropna(axis=0, how="all") # 删除存整行都是NaN的行
df.fillna(100) # 替换NaN为100
df.fillna(df.mean()) # 替换NaN为当前列的平均值
df.iloc[3,:][df.iloc[3,:]==94]=100