pandas速记
概念:
Pandas基于两种数据类型: series 与 dataframe 。
Series:一种类似于一维数组的对象,是由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。仅由一组数据也可产生简单的Series对象。注意:Series中的索引值是可以重复的。
DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看做是由Series组成的字典。
import pandas as pd # 创建一个示例 DataFrame data = { 'Name': ['Alice', 'Bob', 'Charlie', 'David'], 'Age': [25, 30, 35, 40], 'City': ['New York', 'Los Angeles', 'Chicago', 'Houston'] } df = pd.DataFrame(data) # 1. shape - 返回DataFrame的维度(行数, 列数) print(df.shape) # 输出: (4, 3) # 2. index - 返回行索引 print(df.index) # 输出: RangeIndex(start=0, stop=4, step=1) # 3. columns - 返回列名 print(df.columns) # 输出: Index(['Name', 'Age', 'City'], dtype='object') # 4. dtypes - 返回每列的数据类型 print(df.dtypes) # 输出: # Name object # Age int64 # City object # dtype: object # 5. values - 返回DataFrame的Numpy数组表示 print(df.values) # 输出: # [['Alice' 25 'New York'] # ['Bob' 30 'Los Angeles'] # ['Charlie' 35 'Chicago'] # ['David' 40 'Houston']] # 6. size - 返回元素总数(行数×列数) print(df.size) # 输出: 12 # 7. empty - 检查DataFrame是否为空 print(df.empty) # 输出: False # 8. ndim - 返回维度数 print(df.ndim) # 输出: 2 # 9. axes - 返回行轴和列轴的标签列表 print(df.axes) # 输出: # [RangeIndex(start=0, stop=4, step=1), Index(['Name', 'Age', 'City'], dtype='object')] # 10. T - 转置DataFrame print(df.T)
来自ds的访问总结:
# Pandas DataFrame 数据访问详解
DataFrame 的数据访问是 Pandas 最核心的功能之一,提供了多种灵活的方式来选择和操作数据。下面我将详细讲解各种数据访问方法及其应用场景。
## 1. 基础访问方法
### 1.1 列访问
```python
import pandas as pd
data = {
'Name': ['Alice', 'Bob', 'Charlie', 'David'],
'Age': [25, 30, 35, 40],
'City': ['New York', 'Los Angeles', 'Chicago', 'Houston'],
'Salary': [70000, 80000, 90000, 100000]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd'])
# 方法1: 使用列名作为属性 (仅适用于列名是有效的Python标识符时)
print(df.Name)
# 输出:
# a Alice
# b Bob
# c Charlie
# d David
# Name: Name, dtype: object
# 方法2: 使用字典式访问 (推荐)
print(df['Name'])
# 输出同上
# 方法3: 访问多列
print(df[['Name', 'Age']])
# 输出:
# Name Age
# a Alice 25
# b Bob 30
# c Charlie 35
# d David 40
```
### 1.2 行访问
```python
# 方法1: 使用切片 (基于位置)
print(df[1:3]) # 获取第2到第3行(不包括结束位置)
# 输出:
# Name Age City Salary
# b Bob 30 Los Angeles 80000
# c Charlie 35 Chicago 90000
# 方法2: 使用head()/tail()
print(df.head(2)) # 前2行
print(df.tail(1)) # 最后1行
```
## 2. 标签索引访问 (loc)
`loc` 是基于标签的索引器,主要用于通过行和列的**标签**来选择数据。
```python
# 选择单行
print(df.loc['b']) # 获取标签为'b'的行
# 输出:
# Name Bob
# Age 30
# City Los Angeles
# Salary 80000
# Name: b, dtype: object
# 选择多行
print(df.loc[['a', 'c']]) # 获取标签为'a'和'c'的行
# 选择行和列
print(df.loc['a':'c', 'Name':'City']) # 行'a'到'c',列'Name'到'City'
# 输出:
# Name Age City
# a Alice 25 New York
# b Bob 30 Los Angeles
# c Charlie 35 Chicago
# 选择特定行和列
print(df.loc[['a', 'd'], ['Name', 'Salary']])
# 输出:
# Name Salary
# a Alice 70000
# d David 100000
# 条件选择
print(df.loc[df['Age'] > 30]) # 选择Age大于30的行
# 输出:
# Name Age City Salary
# c Charlie 35 Chicago 90000
# d David 40 Houston 100000
# 设置值
df.loc['a', 'Salary'] = 75000 # 修改a行的Salary值
```
## 3. 位置索引访问 (iloc)
`iloc` 是基于整数位置的索引器,类似于Python的列表索引。
```python
# 选择单行
print(df.iloc[1]) # 获取第2行(索引从0开始)
# 输出:
# Name Bob
# Age 30
# City Los Angeles
# Salary 80000
# Name: b, dtype: object
# 选择多行
print(df.iloc[1:3]) # 获取第2到第3行(不包括结束位置)
# 输出:
# Name Age City Salary
# b Bob 30 Los Angeles 80000
# c Charlie 35 Chicago 90000
# 选择行和列
print(df.iloc[0:2, 1:3]) # 第1-2行,第2-3列(不包括结束位置)
# 输出:
# Age City
# a 25 New York
# b 30 Los Angeles
# 选择特定行和列
print(df.iloc[[0, 3], [0, 3]]) # 第1和第4行,第1和第4列
# 输出:
# Name Salary
# a Alice 75000
# d David 100000
# 设置值
df.iloc[0, 1] = 26 # 修改第1行第2列的值(Age)
```
## 4. 布尔索引
通过布尔条件选择数据是非常强大的功能。
```python
# 简单条件
print(df[df['Age'] > 30]) # Age大于30的行
print(df[df['City'] == 'Chicago']) # City为Chicago的行
# 多条件组合
print(df[(df['Age'] > 30) & (df['Salary'] < 100000)]) # AND条件
print(df[(df['Age'] < 30) | (df['Salary'] > 90000)]) # OR条件
print(df[~(df['City'] == 'New York')]) # NOT条件
# isin方法
print(df[df['City'].isin(['New York', 'Chicago'])]) # City为NY或Chicago的行
# 字符串方法
print(df[df['Name'].str.startswith('A')]) # Name以A开头的行
print(df[df['Name'].str.contains('li')]) # Name包含'li'的行
```
## 5. 高级访问方法
### 5.1 at 和 iat
用于快速访问单个标量值。
```python
# at - 基于标签
print(df.at['a', 'Name']) # 输出: Alice
# iat - 基于位置
print(df.iat[0, 0]) # 输出: Alice (第1行第1列)
```
### 5.2 query 方法
使用字符串表达式进行查询。
```python
print(df.query('Age > 30 and Salary < 100000'))
# 输出:
# Name Age City Salary
# c Charlie 35 Chicago 90000
```
### 5.3 where 和 mask
```python
# where - 保留满足条件的值,不满足的替换为NaN或其他值
print(df.where(df['Age'] > 30))
# 输出:
# Name Age City Salary
# a NaN NaN NaN NaN
# b NaN NaN NaN NaN
# c Charlie 35.0 Chicago 90000.0
# d David 40.0 Houston 100000.0
# mask - 与where相反,替换满足条件的值
print(df.mask(df['Age'] > 30))
```
## 6. 多级索引访问
对于具有多级索引(MultiIndex)的DataFrame:
```python
# 创建多级索引DataFrame
index = pd.MultiIndex.from_tuples([
('Group1', 'a'), ('Group1', 'b'),
('Group2', 'a'), ('Group2', 'b')],
names=['Group', 'ID'])
df_multi = pd.DataFrame({
'Value': [10, 20, 30, 40],
'Data': ['A', 'B', 'C', 'D']
}, index=index)
# 访问方法
print(df_multi.loc['Group1']) # 访问Group1的所有数据
print(df_multi.loc[('Group1', 'a')]) # 访问特定组合
print(df_multi.loc[:, 'Value']) # 访问所有行的Value列
```
## 7. 访问方法对比表
| 方法 | 索引类型 | 是否包含结束位置 | 主要用途 | 示例 |
|------|----------|----------------|----------|------|
| `[]` | 列名/行切片 | 不包含结束位置 | 选择列或行切片 | `df['col']`, `df[1:3]` |
| `loc` | 标签 | 包含结束位置 | 基于标签选择 | `df.loc['a':'c', 'Name':'City']` |
| `iloc` | 整数位置 | 不包含结束位置 | 基于位置选择 | `df.iloc[0:2, 1:3]` |
| `at` | 标签 | - | 快速访问单个值 | `df.at['a', 'Name']` |
| `iat` | 整数位置 | - | 快速访问单个值 | `df.iat[0, 0]` |
| `query` | 条件表达式 | - | 使用字符串表达式查询 | `df.query('Age > 30')` |
| 布尔索引 | 条件 | - | 基于条件筛选 | `df[df['Age'] > 30]` |
## 最佳实践建议
1. **优先使用loc和iloc**:比直接使用`[]`更明确,可读性更好
2. **注意索引类型**:明确知道使用的是标签还是位置索引
3. **避免链式赋值**:如`df[df['Age']>30]['Salary']=50000`这种操作可能不会生效,应使用`df.loc[df['Age']>30, 'Salary'] = 50000`
4. **处理大数据时**:布尔索引比query方法通常更快
5. **设置值时**:使用at/iat设置单个值比loc/iloc效率更高
掌握这些数据访问方法可以让你在数据处理中更加得心应手,根据不同的场景选择最合适的方法。
读取csv:
# 路径可以使用r"C:\User\test.csv"
# 方式1:默认读取(自动识别第一行为表头)
df = pd.read_csv('data_with_header.csv')
# 方式2:显式指定header参数
df = pd.read_csv('data_with_header.csv', header=0) # 第一行作为表头
# 结果:
# Name Age Salary Department
# 0 Alice 25 70000 Sales
# 1 Bob 30 80000 IT
# 2 Charlie 35 90000 Finance
可以读取指定的行:
df = pd.read_csv(
'data.csv', # 文件路径
usecols=['Name', 'Age', 'Salary'], # 只读取这三列
dtype={'Age': 'int32', 'Salary': 'float64'}, # 指定列数据类型
index_col='Name' # 将'Name'列设为行索引
)
无表头情况:
# 方式1:不指定列名,自动生成数字列名
df = pd.read_csv('data_no_header.csv', header=None)
# 结果:
# 0 1 2 3
# 0 Alice 25 70000 Sales
# 1 Bob 30 80000 IT
# 2 Charlie 35 90000 Finance
# 方式2:自定义列名
df = pd.read_csv('data_no_header.csv',
header=None,
names=['Name', 'Age', 'Salary', 'Department'])
# 结果:
# Name Age Salary Department
# 0 Alice 25 70000 Sales
# 1 Bob 30 80000 IT
# 2 Charlie 35 90000 Finance

浙公网安备 33010602011771号