首页 > 解决方案 > 如何根据几列中的指定条件选择数据框中的行?

问题描述

我是 pandas 的新手,并试图获取一些匹配两列条件的行

这是我的代码:

import pandas as pd
df = pd.read_csv('sp500.csv')

full_list = []




symbol = df['Symbol']
full_list.append(symbol)
name = df['Name']
full_list.append(name)
sector = df['Sector']
full_list.append(sector)
price = df['Price']
full_list.append(price)
book_value = df['Book Value']
full_list.append(book_value)
low = df['52 week low']
full_list.append(low)
high = df['52 week high']
full_list.append(high)


df = pd.DataFrame(full_list)
df = df.T

print(df.loc[df['Sector'].isin(['Financials','Energy']) and (df['52 week low'] < 80)])

我在文档中找不到正确的命令,问题出在最后一行代码中。请帮助我了解它是如何工作的

标签: pythonpandas

解决方案


你很接近。您需要使用按位运算符并注意考虑不直观的运算符优先级:

df.loc[
    df['Sector'].isin(['Financials','Energy']) &  # not "and"
    (df['52 week low'] < 80) # these parenthesis are crucial
]

旁注,没有看到您正在使用的文本文件,我不禁认为您最好直接选择列而不是重建数据框:

import pandas as pd
cols_to_keep = ['Symbol', 'Name', 'Sector', 'Price', 'Book Value', '52 week low', '52 week high']
rows_to_keep = lambda df: df['Sector'].isin(['Financials','Energy']) & (df['52 week low'] < 80)

df = (
    pd.read_csv('sp500.csv')
        .loc[row_to_keep, cols_to_keep]
)

推荐阅读