Pandas数据类型-DataFrame之创建和访问


DataFrame是一个表格型(类似Excel)的数据结构,它既有行,也有列,每一行的索引为index,每一列的索引为column。
同样也可以把DataFrame类型看作是一维的,由同样行索引的一组数据组成。

DataFrame的创建

创建空的DataFrame

import pandas as pd
pd.DataFrame(columns={"a":"","b":"","c":""},index=[0])
abc
0NaNNaNNaN

通过字典创建

  • key为列名,字典的value就是一个Serise.values,即为一列数据
dict1 = {"name":["Jim", "Lucy", "HanMeimei", "Lili"], "age":[11, 12, 13, 14], "score":[90, 100, 80, 70]}
pd.DataFrame(dict1)
nameagescore
0Jim1190
1Lucy12100
2HanMeimei1380
3Lili1470

直接用list的数据创建DataFrame

  • 一个二维列表,注意列表中的每一个列表元素为一行数据
df1 = pd.DataFrame([[1, 2, 3],["a", "b", "c"], ["a1", "b2", "c3"]], index=["第一行", "第二行", "第三行"], 
                   columns=["第一列", "第二列", "第三列"])
print(df1)
    第一列 第二列 第三列
第一行   1   2   3
第二行   a   b   c
第三行  a1  b2  c3

读取csv或者excel文件为DataFrame格式

df1 = pd.read_excel(r".\study\test_excel.xlsx", sheet_name="student")
print("df1---------------\n", df1, type(df1))
df1---------------
   name  age sex address  score
0   刘一   18   女      上海    100
1   花二   40   男      上海     99
2   张三   25   男      北京     80
3   李四   30   男      西安     40
4   王五   70   男      青岛     70
5   孙六   65   女      泰州     90 <class 'pandas.core.frame.DataFrame'>

用numpy的矩阵创建dataframe

import numpy as np
array = np.random.rand(2,3)    #2行3列
df1 = pd.DataFrame(array,columns=['first','second','third'])
print(df1)
      first    second     third
0  0.671161  0.319496  0.998158
1  0.372354  0.456053  0.945547

查看DataFrame数据属性

df.head()

  • 默认查看数据前5行
array = np.random.rand(8,3)
df1 = pd.DataFrame(array,columns=['first','second','third'])
print(df1.head(3))
      first    second     third
0  0.414661  0.576802  0.733472
1  0.304392  0.706122  0.367632
2  0.737718  0.700953  0.710541

查看数据后几行

  • 默认查看数据后5行
df1.tail()
firstsecondthird
30.6802790.6538300.120031
40.1246610.8036620.411242
50.0181450.4924440.738249
60.8711110.4838600.381885
70.7198170.9618530.526238

重置索引

  • df.reset_index, 重置索引,添加新的索引0-n
  • df.set_index, 重置索引,设置某一列为新的索引
print(df1.reset_index())
print(df1.set_index("第0列"))
  index       第0列       第1列       第2列
0   第0行  0.938223  0.450784  0.958613
1   第1行  0.005883  0.433231  0.654217
2   第2行  0.729364  0.424220  0.960798
3   第3行  0.829794  0.090153  0.134994
4   第4行  0.391034  0.001752  0.626693
5   第5行  0.975350  0.318862  0.626255
6   第6行  0.400560  0.815432  0.417564
7   第7行  0.359789  0.565618  0.130726
               第1列       第2列
第0列                         
0.938223  0.450784  0.958613
0.005883  0.433231  0.654217
0.729364  0.424220  0.960798
0.829794  0.090153  0.134994
0.391034  0.001752  0.626693
0.975350  0.318862  0.626255
0.400560  0.815432  0.417564
0.359789  0.565618  0.130726

查看下标

  • df.index, df.columns
  • 当需要修改时,必须统一修改,不能单个修改
df1.index = ["第"+ str(i) +"行" for i in range(8)]
df1.columns = ["第"+ str(i) +"列" for i in range(3)]
print(df1.index)
print(df1.columns)
Index(['第0行', '第1行', '第2行', '第3行', '第4行', '第5行', '第6行', '第7行'], dtype='object')
Index(['第0列', '第1列', '第2列'], dtype='object')

查看下标

  • df.index, df.columns
  • 当需要修改时,必须统一修改,不能单个修改

查看数据值

df1.values
array([[0.38875075, 0.43803462, 0.12459244],
       [0.56419024, 0.75568682, 0.13764671],
       [0.80400939, 0.79626389, 0.66016963],
       [0.31140927, 0.76798005, 0.21945531],
       [0.14646588, 0.92297446, 0.7054672 ],
       [0.66496854, 0.30049814, 0.54736761],
       [0.07047599, 0.47393679, 0.2407982 ],
       [0.5220982 , 0.61223117, 0.68845914]])

查看数据特性

  • df.dtypes
  • df.shape
  • df.ndim
  • df.size
  • df.axes
print(df1.dtypes) #查看dataframe数据类型
print(df1.shape)  #查看dataframe的形状
print(df1.ndim)   #返回维数
print(df1.size)   #查看dataframe的数据数目
print(df1.axes)   #查看横纵坐标的标签名
first     float64
second    float64
third     float64
dtype: object
(8, 3)
2
24
[RangeIndex(start=0, stop=8, step=1), Index(['first', 'second', 'third'], dtype='object')]

单独计算某列的统计值

  • df1[‘first’].sum() #求和
  • df1[‘first’].mean() #求平均数
  • df1[‘first’].count() #求数量
  • df1[‘first’].max()
  • df1[‘first’].min()

DataFrame元素的访问

索引单个cell

使用at,iat

  • 通过元素的行和列索引对来访问单个cell,at 和 iat 属性只能访问单个cell,区别是at可以使用字符串和整数,而iat只能使用整数。
    at 和 iat 的格式是:[row, column]。
df1 = pd.read_excel(r".\study\test_excel.xlsx", sheet_name="student")
print("df1---------------\n", df1, type(df1))
df1---------------
   name  age sex address  score
0   刘一   18   女      上海    100
1   花二   40   男      上海     99
2   张三   25   男      北京     80
3   李四   30   男      西安     40
4   王五   70   男      青岛     70
5   孙六   65   女      泰州     90 <class 'pandas.core.frame.DataFrame'>
print(df1.at[3, "age"])
print(df1.iat[3, 0])
print(df1.loc[3, 'age'])
30
李四
30

使用属性和索引方式

print(df1.name[2])
print(df1["name"][4])    # df1["name"]得到一列,series,df1["name"][4]得到该series中的一个数据
张三
王五

使用loc,iloc

  • df.loc和iloc主要是根据DataFrame的行标和列标进行数据的筛选的,通过行列名称或者索引进行访问行或者列,都可以只传入单个值,实现精确匹配
print(df1.loc[2, "name"])
张三

访问多个元素

  • loc 和 iloc 属性可以访问多个cell,区别是loc可以使用标签和布尔(掩码)数组,不能使用整数位置(整数代表元素的位置),
    而iloc只能使用整数位置。

通过属性方式访问列

  • 通过属性方式只能访问单独的列,返回series对象。
  • 对于列索引数组方式,一次访问多列。返回的对象是DataFrame类型。

df1 = pd.read_excel(r".\study\test_excel.xlsx", sheet_name="student")
print("df1---------------\n", df1["age"])  # 通过索引方式访问 
print("df1---------------\n", df1.age)     # 通过属性方式访问 
print(df[['name','age']])    # 通过索引数组方式访问 
df1---------------
 0    18
1    40
2    25
3    30
4    70
5    65
Name: age, dtype: int64
df1---------------
 0    18
1    40
2    25
3    30
4    70
5    65
Name: age, dtype: int64
  name  age
0   刘一   18
1   花二   40
2   张三   25
3   李四   30
4   王五   70
5   孙六   65

访问单行,包括所有列

  • loc[row] 访问单行,包含所有列的数据
df1 = pd.read_csv(r".\study\weather.txt")
df1.set_index('ymd', inplace=True)   #将行标签改为第ymd列的值
df1.loc["2018-01-03"]
bWendu         2℃
yWendu        -5℃
tianqi         多云
fengxiang      北风
fengli       1-2级
aqi            28
aqiInfo         优
aqiLevel        1
Name: 2018-01-03, dtype: object

通过loc和iloc多方式访问

[row, column]方式
  • [row, column]访问由row和column 确定的元素
  • 行列标签任意可以是列表或者一个范围
df1 = pd.read_csv(r".\study\weather.txt")
df1.set_index('ymd', inplace=True)   #将行标签改为第ymd列的值
print(df1.loc[['2018-01-03','2018-01-04','2018-01-08'], 'bWendu'])    #得到series类型
print(df1.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']])     #得到DataFrame类型
df2 = df1.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']    # 行列都是范围
print("df2-----------\n", df2)
df1.loc["2018-01-03"]
ymd
2018-01-03    2℃
2018-01-04    0℃
2018-01-08    2℃
Name: bWendu, dtype: object
           bWendu yWendu
ymd                     
2018-01-03     2℃    -5℃
2018-01-04     0℃    -8℃
2018-01-05     3℃    -6℃
df2-----------
            bWendu yWendu tianqi fengxiang
ymd                                      
2018-01-03     2℃    -5℃     多云        北风
2018-01-04     0℃    -8℃      阴       东北风
2018-01-05     3℃    -6℃   多云~晴       西北风





bWendu         2℃
yWendu        -5℃
tianqi         多云
fengxiang      北风
fengli       1-2级
aqi            28
aqiInfo         优
aqiLevel        1
Name: 2018-01-03, dtype: object
布尔列表,访问行
  • 为True的访问,否则不访问
df2.loc[[True, False, True]]   # 布尔列表,和行对应
bWenduyWendutianqifengxiang
ymd
2018-01-032℃-5℃多云北风
2018-01-053℃-6℃多云~晴西北风

条件筛选
  • 可以是条件表达式,得到一个布尔列表。序列具有矢量化操作的特性,当选择某一列时,可以通过逻辑运算得出布尔索引数组
  • 当条件表达式组合时,注意每一个都需要有括号, 通过逻辑运算符连接起来
df1 = pd.read_excel(r".\study\test_excel.xlsx", sheet_name="student")
print("df1---------------\n", df1, type(df1))
print((df1["age"]>50) & (df1["score"]<80))
df1.loc[(df1["age"]>50) & (df1["score"]<80), :]
df1---------------
   name  age sex address  score
0   刘一   18   女      上海    100
1   花二   40   男      上海     99
2   张三   25   男      北京     80
3   李四   30   男      西安     40
4   王五   70   男      青岛     70
5   孙六   65   女      泰州     90 <class 'pandas.core.frame.DataFrame'>
0    False
1    False
2    False
3    False
4     True
5    False
dtype: bool
nameagesexaddressscore
4王五70青岛70

利用函数查询
  • lambda函数
df1.loc[lambda df1: (df1["age"]<50) & (df1["score"]<80), :]
nameagesexaddressscore
3李四30西安40
  • 自定义函数
df1 = pd.read_csv(r".\study\weather.txt")
df1.set_index('ymd', inplace=True)   #将行标签改为第ymd列的值
# df1.index.str.startswith("2018-09") & (df1["aqiLevel"]==1)
def query_my_data(df):
    return df.index.str.startswith("2018-09")& df1["aqiLevel"]==1
df1.loc[query_my_data,:].head(5)    #传函数名,参数就为df1
bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-09-0127℃19℃阴~小雨南风1-2级501
2018-09-0431℃18℃西南风3-4级241
2018-09-0531℃19℃晴~多云西南风3-4级341
2018-09-0627℃18℃多云~晴西北风4-5级371
2018-09-0727℃16℃西北风3-4级221
第1关:Pandas数据清洗 200 任务要求 参考答案 记录 评论7 任务描述 相关知识 缺失值处理 检查缺失值 处理缺失值 重复值处理 检查重复值 重复值处理 异常值处理 检测异常值 异常值处理 编程要求 测试说明 任务描述 本关任务:读取数据,输出删除NA值以及重复值之后的结果,并重置索引列。 相关知识 数据清洗的目的有两个,第一是通过清洗让数据可用。第二是让数据变的更适合进行后续的分析工作。换句话说就是有”脏”数据要洗,干净的数据也要洗。 缺失值处理 检查缺失值 Pandas提供了isnull()notnull()两个函数来检测数据中的NaN值。SeriesDataFrame对象都可以使用。 df = pd.DataFrame({ "one": [1, 2, np.nan, 5, np.nan, np.nan, 68], "two": ["a","b","c",np.nan,"f",np.nan,"g"]}) df.isnull() # notnull()则相反,非空的显示True 输出: one two 0 False False 1 False False 2 True False 3 False True 4 True False 5 True True 6 False False 处理缺失值 Pandas中可以通过fillna()函数来用非空数据填充NA值,如果想排除缺少的值,可以使用dropna()函数。 填充: df = pd.DataFrame({ "one": [1, 2, np.nan, 5, np.nan, np.nan, 68], "two": ["a","b","c",np.nan,"f",np.nan,"g"]}) df.fillna("a") #可以填充标量 输出: one two 0 1 a 1 2 b 2 a c 3 5 a 4 a f 5 a a 6 68 g 删除缺失值时,可以传入axis参数,axis=0时则整行被删除,反之则整列被删除。默认值为0。 df = pd.DataFrame({ "one": [1, 2, np.nan, 5, np.nan, np.nan, 68], "two": ["a","b","c",np.nan,"f",np.nan,"g"]}) df.dropna() 输出: one two 0 1.0 a 1 2.0 b 6 68.0 g 重复值处理 检查重复值 Pandas中的duplicated()返回bool的Series序列表示该行是不是重复值。 df = pd.DataFrame({ "one": [1, 2, np.nan, 1, np.nan, np.nan, 68], "two": [1,"b","c",1,"f",np.nan,"g"]}) df.duplicated() 输出: 0 False 1 False 2 False 3 True 4 False 5 False 6 False dtype: bool 重复值处理 drop_duplicates()直接对重复数据(行)进行删除,返回DataFrame。 df = pd.DataFrame({ "one": [1, 2, np.nan, 1, np.nan, np.nan, 68], "two": [1,"b","c",1,"f",np.nan,"g"]}) df.drop_duplicates() 输出: one two 0 1.0 1 1 2.0 b 2 NaN c 4 NaN f 5 NaN NaN 6 68.0 g 可以传入一个列名参数,该列的所有重复行将会删除: df.drop_duplicates("one") 输出: one two 0 1.0 1 1 2.0 b 2 NaN c 6 68.0 g 异常值处理 检测异常值 发现异常值的方法是对数据进行描述性统计。使用describe函数可以生成描述统计结果,然后观察异常值的存在。超出数据正常范围的值即为异常值。 data ={ 'Name':pd.Series(['Tom','James','Ricky','Vin','Steve','Minsu','Jack','Lee']), 'Age':pd.Series(
03-12
### 数据清洗概述 数据清洗是数据科学工作流程中的重要环节,直接影响模型质量分析结果的可靠性[^1]。本节将详细介绍如何使用 Pandas 进行数据清洗,涵盖缺失值、重复值异常值的具体处理方法。 #### 处理缺失值 ##### 检测缺失值 为了检测 DataFrame 中是否存在缺失值,可以使用 `isnull()` 函数来生成布尔矩阵,其中 True 表示存在缺失值: ```python import pandas as pd print(df.isnull()) ``` 也可以通过 `any` `all` 来汇总整个 DataFrame 或列是否有任何缺失值: ```python print(np.any(pd.isnull(df))) # 如果有任何缺失值,则返回 True print(np.all(pd.notnull(df))) # 如果没有任何缺失值,则返回 True ``` ##### 删除缺失值 当决定删除含有缺失值的记录时,可采用 `dropna()` 方法: ```python cleaned_df = df.dropna() ``` 此命令会默认移除所有包含至少一个 NaN 的行;可以通过参数调整行为,例如仅在特定列无缺失的情况下保留该行。 ##### 填充缺失值 对于希望保留但需填补的信息,`fillna()` 提供了多种策略,如均值填充: ```python df['column_name'].fillna(value=df['column_name'].mean(), inplace=True) ``` 或者指定固定数值或其他逻辑进行填充。 #### 处理重复值 ##### 检查重复项 利用 `duplicated()` 可以找出哪些行与其他行完全相同: ```python duplicate_rows = df[df.duplicated()] ``` 这有助于识别潜在冗余并评估其影响范围。 ##### 移除重复项 一旦确认要消除这些副本,调用 `drop_duplicates()` 即可实现这一目标: ```python unique_df = df.drop_duplicates() ``` 同样支持按选定字段组合去重。 #### 检测与处理异常值 针对异常值问题,通常先基于业务理解设定合理区间外的数据视为异常点。一种常见做法是在可视化基础上结合统计量辅助判断,之后采取适当措施修正或剔除它们。例如,替换超出上下限的极值为边界处取值或是直接将其设为空缺待补救。 ```python # 替换无穷大/负无穷大的值为NaN后再清理 df.replace([np.inf, -np.inf], np.nan).dropna(axis=1) # 对于已知分布特性的变量,考虑应用Z-score等标准化技术筛选离群点 from scipy import stats z_scores = stats.zscore(df.select_dtypes(include=[np.number])) abs_z_scores = abs(z_scores) filtered_entries = (abs_z_scores < 3).all(axis=1) new_df = df[filtered_entries] ``` 上述过程展示了完整的数据预处理链路,确保输入至后续建模阶段的数据集质量可靠稳定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值