我有一个Python熊猫数据框架rpt:
rpt
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 47518 entries, ('000002', '20120331') to ('603366', '20091231')
Data columns:
STK_ID 47518 non-null values
STK_Name 47518 non-null values
RPT_Date 47518 non-null values
sales 47518 non-null values
我可以像这样过滤股票id为'600809'的行:rpt[rpt['STK_ID'] == '600809']
<class 'pandas.core.frame.DataFrame'>
MultiIndex: 25 entries, ('600809', '20120331') to ('600809', '20060331')
Data columns:
STK_ID 25 non-null values
STK_Name 25 non-null values
RPT_Date 25 non-null values
sales 25 non-null values
我想把一些股票的所有行放在一起,例如['600809','600141','600329']。这意味着我想要一个这样的语法:
stk_list = ['600809','600141','600329']
rst = rpt[rpt['STK_ID'] in stk_list] # this does not works in pandas
既然熊猫不接受上述命令,如何实现目标呢?
如果您有一个精确匹配的列表,Isin()是理想的,但如果您有一个部分匹配或子字符串的列表要查找,您可以使用str.contains方法和正则表达式进行筛选。
例如,如果我们想返回一个DataFrame,其中所有的股票id都以'600'开头,然后后跟任何三位数字:
>>> rpt[rpt['STK_ID'].str.contains(r'^600[0-9]{3}$')] # ^ means start of string
... STK_ID ... # [0-9]{3} means any three digits
... '600809' ... # $ means end of string
... '600141' ...
... '600329' ...
... ... ...
假设现在我们有一个字符串列表,我们希望'STK_ID'中的值以它结尾,例如:
endstrings = ['01$', '02$', '05$']
我们可以使用正则表达式'或'字符|来连接这些字符串,并将字符串传递给str.contains来过滤DataFrame:
>>> rpt[rpt['STK_ID'].str.contains('|'.join(endstrings)]
... STK_ID ...
... '155905' ...
... '633101' ...
... '210302' ...
... ... ...
最后,contains可以忽略case(通过设置case=False),允许您在指定想要匹配的字符串时更加通用。
例如,
str.contains('pandas', case=False)
将匹配PANDAS, PANDAS, paNdAs123,等等。
如果您有一个精确匹配的列表,Isin()是理想的,但如果您有一个部分匹配或子字符串的列表要查找,您可以使用str.contains方法和正则表达式进行筛选。
例如,如果我们想返回一个DataFrame,其中所有的股票id都以'600'开头,然后后跟任何三位数字:
>>> rpt[rpt['STK_ID'].str.contains(r'^600[0-9]{3}$')] # ^ means start of string
... STK_ID ... # [0-9]{3} means any three digits
... '600809' ... # $ means end of string
... '600141' ...
... '600329' ...
... ... ...
假设现在我们有一个字符串列表,我们希望'STK_ID'中的值以它结尾,例如:
endstrings = ['01$', '02$', '05$']
我们可以使用正则表达式'或'字符|来连接这些字符串,并将字符串传递给str.contains来过滤DataFrame:
>>> rpt[rpt['STK_ID'].str.contains('|'.join(endstrings)]
... STK_ID ...
... '155905' ...
... '633101' ...
... '210302' ...
... ... ...
最后,contains可以忽略case(通过设置case=False),允许您在指定想要匹配的字符串时更加通用。
例如,
str.contains('pandas', case=False)
将匹配PANDAS, PANDAS, paNdAs123,等等。
你也可以使用'query'和@来达到类似的效果:
eg:
df = pd.DataFrame({'A': [1, 2, 3], 'B': ['a', 'b', 'f']})
df = pd.DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
list_of_values = [3,6]
result= df.query("A in @list_of_values")
result
A B
1 6 2
2 3 3