pandas中关于数据选择和过滤
1. 基本数据选择和过滤
1.1 按列选择
-
单列选择:
df['column_name'] # 返回一个Series
-
多列选择:
df[['column_name1', 'column_name2']] # 返回一个DataFrame
-
列切片选择:
df.loc[:, 'column_name1':'column_name3'] # 选择从 'column_name1' 到 'column_name3' 的所有列
1.2 按行选择
-
单行选择:
df.iloc[2] # 选择第3行(基于0的索引)
-
多行选择:
df.iloc[2:5] # 选择第3到第5行(不包括第5行) df.loc[2:5] # 使用索引标签选择第2到第5行(包括第5行)
-
条件选择:
df[df['column_name'] > 10] # 选择 'column_name' 列值大于10的行
2. 复杂条件过滤
2.1 使用布尔运算符
-
多条件过滤:
-
使用
&
(AND):df[(df['column1'] > 10) & (df['column2'] == 'value')]
-
使用
|
(OR):df[(df['column1'] > 10) | (df['column2'] == 'value')]
-
-
否定条件过滤:
- 使用
~
(取反):df[~(df['column_name'] > 10)] # 选择 'column_name' 列值不大于10的行
- 使用
2.2 使用 isin
进行多值过滤
-
多个值过滤:
df[df['column_name'].isin(['value1', 'value2', 'value3'])]
-
不在列表中的值:
df[~df['column_name'].isin(['value1', 'value2'])]
2.3 使用 query
方法
- 类似SQL的过滤:
df.query('column1 > 10 and column2 == "value"')
3. 高级选择和过滤技巧
3.1 使用 between
方法
- 范围选择:
df[df['column_name'].between(10, 20)] # 选择 'column_name' 列值在10到20之间的行
3.2 使用字符串方法
- 字符串匹配:
-
包含子字符串:
df[df['column_name'].str.contains('substring', na=False)]
-
以特定字符串开头或结尾:
df[df['column_name'].str.startswith('prefix', na=False)] df[df['column_name'].str.endswith('suffix', na=False)]
-
3.3 使用 apply
和 lambda
表达式
- 基于复杂逻辑的行选择:
df[df.apply(lambda row: row['column1'] > 10 and row['column2'] == 'value', axis=1)]
3.4 使用 transform
方法
- 按组计算:
df['normalized_column'] = df.groupby('group_column')['value_column'].transform(lambda x: (x - x.mean()) / x.std())
3.5 使用 pivot_table
进行数据透视
- 数据透视表:
pivot_df = df.pivot_table(values='value_column', index='index_column', columns='columns_column', aggfunc='mean')
4. 多级索引和层次化索引
4.1 多级索引选择
-
创建多级索引:
df.set_index(['column1', 'column2'], inplace=True)
-
多级索引过滤:
- 通过
.loc
选择特定层级的索引:df.loc['index1'] # 选择第一级索引为 'index1' 的所有行 df.loc[('index1', 'index2')] # 选择第一级索引为 'index1' 且第二级索引为 'index2' 的行
- 通过
-
按层级选择:
- 使用
IndexSlice
对象:idx = pd.IndexSlice df.loc[idx['index1', :], :] # 选择第一级索引为 'index1' 的所有行
- 使用
5. 数据选择的优化和性能提升
5.1 使用 numpy
函数进行矢量化操作
- 矢量化计算更高效:
df['new_column'] = np.where(df['column1'] > 10, 'A', 'B')
5.2 使用 eval
和 query
优化
eval
和query
进行更高效的计算:-
eval
:df.eval('new_column = column1 + column2')
-
query
:df.query('column1 > 10 and column2 < 5')
-
5.3 避免 apply
方法
- 尽量避免使用
apply
进行行级计算,因为其性能较低:- 替代方法如直接使用矢量化运算:
df['new_column'] = df['column1'] * df['column2']
- 替代方法如直接使用矢量化运算:
6. 其他高级选择和过滤技巧
6.1 使用 groupby
进行选择
- 基于分组条件的选择:
grouped = df.groupby('group_column') selected_group = grouped.get_group('group_name')
6.2 使用 filter
方法
- 按条件过滤分组:
df.groupby('group_column').filter(lambda x: len(x) > 2) # 过滤出行数大于2的分组
6.3 自定义函数和选择
- 结合自定义函数进行复杂选择:
def complex_filter(row): return row['column1'] > 10 or (row['column2'] < 5 and row['column3'] == 'value') df[df.apply(complex_filter, axis=1)]