<think>我们被要求使用pandas获取DataFrame中的数据。根据用户的问题,他想要知道如何从DataFrame中提取数据。我们可以从以下几个方面来回答:1.选择列2.选择行3.选择特定的单元格(行和列的交点)4.使用条件选择(布尔索引)5.使用索引标签选择(loc)和位置索引选择(iloc)6.使用查询表达式(query)我们将结合引用中的信息,并给出示例代码。引用[4]提到了如何获取DataFrame的行名(index索引),引用[3]展示了如何获取重复行,引用[2]介绍了DataFrame的特点,引用[1]则指向了pandas的官方文档。下面我们将详细说明各种数据提取方法:</think>### Pandas DataFrame 数据提取方法详解
Pandas 提供了多种灵活的方式从 DataFrame 中提取数据,以下是常用的数据提取方法:
#### 1. 列数据提取
```python
# 获取单列数据(返回Series)
name_series = df['Name']
# 获取多列数据(返回DataFrame)
subset = df[['Name', 'Age']]
# 使用点号获取列(仅限列名无空格)
age_series = df.Age
```
#### 2. 行数据提取
```python
# 通过位置索引获取行
row_2 = df.iloc[1] # 获取第2行(索引从0开始)
# 通过标签索引获取行
row_beijing = df.loc['北京'] # 获取行名为"北京"的行
# 切片获取连续行
first_3_rows = df.iloc[0:3] # 获取前3行
```
#### 3. 单元格数据提取
```python
# 获取单个单元格的值(行索引+列名)
john_age = df.at[0, 'Age'] # 第1行'Age'列的值
# 获取单个单元格的值(行位置+列位置)
first_cell = df.iat[0, 0] # 第1行第1列的值
```
#### 4. 条件筛选(布尔索引)
```python
# 获取年龄大于25的所有行
adults = df[df['Age'] > 25]
# 组合条件筛选(使用&代替and)
ny_adults = df[(df['City'] == 'New York') & (df['Age'] > 25)]
# 使用query方法
paris_residents = df.query("City == 'Paris'")
```
#### 5. 索引操作
```python
# 获取行索引列表
index_names = df.index.tolist() # 如 ['北京', '天津', ...]
# 获取列名列表
column_names = df.columns.tolist() # 如 ['Name', 'Age', 'City']
# 重置索引
df_reset = df.reset_index()
```
#### 6. 重复数据处理
```python
# 获取所有重复行(基于所有列)
duplicates = df[df.duplicated(keep=False)]
# 获取特定列重复的行
name_duplicates = df[df.duplicated(subset=['Name'], keep=False)]
```
#### 7. 数据类型转换
```python
# 转换为NumPy数组
numpy_array = df.values
# 转换为Python字典
data_dict = df.to_dict(orient='records')
```
#### 8. 迭代访问
```python
# 按行迭代
for index, row in df.iterrows():
print(f"{row['Name']} is {row['Age']} years old")
# 按列迭代
for column_name, column_data in df.items():
print(f"Column {column_name} has {len(column_data)} values")
```
#### 示例应用
```python
import pandas as pd
# 创建示例DataFrame
data = {
'城市': ['北京', '上海', '广州', '北京', '深圳'],
'人口(万)': [2154, 2487, 1874, 2154, 1756],
'GDP(亿元)': [40269, 43214, 28232, 40269, 30665]
}
df = pd.DataFrame(data)
# 1. 获取北京的数据
beijing_data = df[df['城市'] == '北京']
# 2. 获取GDP前3的城市
top_gdp = df.nlargest(3, 'GDP(亿元)')
# 3. 获取重复行(基于所有列)
duplicates = df[df.duplicated(keep=False)]
print("北京数据:\n", beijing_data)
print("\nGDP前三城市:\n", top_gdp)
print("\n重复行:\n", duplicates)
```
#### 输出示例:
```
北京数据:
城市 人口(万) GDP(亿元)
0 北京 2154 40269
3 北京 2154 40269
GDP前三城市:
城市 人口(万) GDP(亿元)
1 上海 2487 43214
0 北京 2154 40269
4 深圳 1756 30665
重复行:
城市 人口(万) GDP(亿元)
0 北京 2154 40269
3 北京 2154 40269
```
#### 性能提示:
- 对于大数据集,避免使用`iterrows()`,改用`itertuples()`提高性能
- 使用向量化操作代替循环(如`df['new_col'] = df['col1'] + df['col2']`)
- 使用`loc`和`iloc`进行索引比链式索引更高效[^1]