Python中如何使用pandas的DataFrame实现数据筛选?

需求

有一个 df1 的 dataframe 数据,我如何实现数据筛选呢?
比如筛选出来 2018 年的数据行,如果再复杂一点的呢,比如 2018 年价格低于 2500 的行
下面是前 20 行的例子

数据:

>>> df1
         pd_date price
0        2018 年 3 月  1499
1        2018 年 5 月  1398
2     2018 年 3 月 20 日   999
3     2018 年 8 月 29 日  3499
4     2017 年 9 月 30 日  2598
5     2017 年 6 月 16 日  1859
6     2018 年 3 月 28 日  2998
7    2017 年 12 月 29 日  1199
8        2018 年 7 月  3699
9          2017 年  2299
10       2018 年 9 月  2399
11   2017 年 12 月 26 日   880
12   2016 年 11 月 14 日  1788
13     2017 年 9 月 1 日   799
14     2018 年 7 月 7 日  1898
15     2018 年 9 月 1 日  2889
16       2018 年 5 月  3499
17      2016 年 11 月  1099
18       2018 年 5 月  3199
19      2017 年 12 月  1499
20       2017 年 9 月  5199

Python中如何使用pandas的DataFrame实现数据筛选?

5 回复

df.where


import pandas as pd

# 创建示例DataFrame
data = {
    '姓名': ['张三', '李四', '王五', '赵六', '钱七'],
    '年龄': [25, 32, 28, 35, 22],
    '部门': ['技术部', '销售部', '技术部', '人事部', '销售部'],
    '薪资': [8000, 6500, 9000, 5500, 7000]
}
df = pd.DataFrame(data)

# 1. 基本条件筛选
# 筛选年龄大于30岁的员工
df_age_30 = df[df['年龄'] > 30]
print("年龄大于30岁的员工:")
print(df_age_30)

# 2. 多条件筛选
# 筛选技术部且薪资大于8000的员工
df_tech_high = df[(df['部门'] == '技术部') & (df['薪资'] > 8000)]
print("\n技术部薪资大于8000的员工:")
print(df_tech_high)

# 3. 使用query方法
df_query = df.query('年龄 >= 25 and 部门 in ["技术部", "销售部"]')
print("\n年龄≥25且在技术部或销售部的员工:")
print(df_query)

# 4. 字符串筛选
# 筛选姓名包含"三"的员工
df_name = df[df['姓名'].str.contains('三')]
print("\n姓名包含'三'的员工:")
print(df_name)

# 5. isin筛选
# 筛选部门为技术部或销售部
df_dept = df[df['部门'].isin(['技术部', '销售部'])]
print("\n技术部或销售部的员工:")
print(df_dept)

# 6. 使用loc进行筛选
df_loc = df.loc[(df['年龄'] > 25) & (df['薪资'] < 8000), ['姓名', '部门']]
print("\n年龄>25且薪资<8000的员工姓名和部门:")
print(df_loc)

# 7. 筛选特定列
# 只显示满足条件的姓名和薪资列
df_cols = df[df['年龄'] > 25][['姓名', '薪资']]
print("\n年龄>25的员工姓名和薪资:")
print(df_cols)

核心要点:

  • 单条件用df[条件]
  • 多条件用&(与)|(或),注意括号
  • query()适合复杂条件,语法更直观
  • str.contains()处理字符串模糊匹配
  • isin()匹配多个值
  • loc可同时筛选行和列

总结建议: 根据需求选择合适方法,多条件注意括号优先级。

year_list = []
for date in df1[‘pd_date’].tolist():
date =date[:4]
year_list.append(date)
df1[‘year’] = pd.Series(year_list)
筛选出来 2018 年的数据行= df1[df1[‘year’]==‘2018’]
2018 年价格低于 2500 的行=df1[(df1[‘year’]==‘2018’) & (df1[‘price’]<2500)]

利用 PythonPython 进行数据分析.epub

df1[(df1[‘pd_date’].str[:4]==‘2018’)&(df1[‘price’]<2500)]

回到顶部