其他分享
首页 > 其他分享> > 在 DataFrame 多列数据中模糊查找匹配数据

在 DataFrame 多列数据中模糊查找匹配数据

作者:互联网

先了解一个 DataFrame 筛选数据的方式

import pandas as pd

# 创建 DataFrame
df = pd.DataFrame(data = [[True, False, False, False],
                          [False, True, False, False], 
                          [True, True, False, False], 
                          [False, False, True, False]], 
                  columns = list('abcd'))
df
abcd
0TrueFalseFalseFalse
1FalseTrueFalseFalse
2TrueTrueFalseFalse
3FalseFalseTrueFalse
# 任一行中,只有其 a 列的值为 True 时,才会输出
df[df.a]
abcd
0TrueFalseFalseFalse
2TrueTrueFalseFalse
# 任一行中,只有其 b 列的值为 True 时,才会输出
df[df.b]
abcd
1FalseTrueFalseFalse
2TrueTrueFalseFalse
# 任一行中,当其 a列 或 b列 的值为 True 时,才会输出
df[df.a | df.b]
abcd
0TrueFalseFalseFalse
1FalseTrueFalseFalse
2TrueTrueFalseFalse
# 任一行中,当其 a列 且 b列 的值为 True 时,才会输出
df[df.a & df.b]
abcd
2TrueTrueFalseFalse

了解了以上内容后,剩下的就是如何将数据变为 True 了

用 TuShare 上的指数数据来举个例子。



点击 https://tushare.pro/register?reg=414428 ,免费注册后即可获取 tushare 的 token,就可以下载各种金融数据了。



比如,想设计一个输入框,既可以输入指数代码,也可以输入指数名称,来获取指数日线数据。
那么程序获得输入信息后,如何能方便的在两列数据里匹配到你要的数据呢?

# -*- coding: UTF-8 -*-
#
# 从 tushare.pro 获取指数数据
# 
# 数据接口说明 https://tushare.pro/document/2?doc_id=94
#              https://tushare.pro/document/2?doc_id=95
#
import tushare as ts
import pandas as pd

# 初始化 tushare 连接
ts.set_token('your_token_code')
pro = ts.pro_api()
市场代码说明
MSCIMSCI指数
CSI中证指数
SSE上交所指数
SZSE深交所指数
CICC中金指数
SW申万指数
OTH其他指数
# 先获取 TuShare 提供的指数基本信息数据
# 接口说明:https://tushare.pro/document/2?doc_id=94
# 
df_index = pd.DataFrame()
mktlist = ['SSE', 'SZSE', 'CSI', 'MSCI', 'SW', 'CICC', 'OTH']
for mkt in mktlist:
    if df_index.empty:
        df_index = pro.index_basic(market=mkt)
    else:
        df_index = df_index.append(pro.index_basic(market=mkt))
df_index
ts_codenamemarketpublishercategorybase_datebase_pointlist_date
0000001.SH上证指数SSE中证公司综合指数19901219100.0019910715
1000002.SH上证A指SSE中证公司综合指数19901219100.0019920221
2000003.SH上证B指SSE中证公司综合指数19920221100.0019920221
3000004.SH上证工业类指数SSE中证公司综合指数199304301358.7819930503
4000005.SH上证商业类指数SSE中证公司综合指数199304301358.7819930503
...........................
946YCJ006.IB银行间综合债券指数(净价)OTH全国银行间拆借中心债券指数200701041000.0020070104
947YCJ007.IB银行间企业债指数(净价)OTH全国银行间拆借中心债券指数200701041000.0020070104
948YCJ008.IB银行间中期票据指数(净价)OTH全国银行间拆借中心债券指数200805041000.0020080504
949ZNCI.SHF上期锌期货价格指数OTH上海期货交易所商品指数200708101000.0020161201
950ZNEI.SHF上期锌超额收益指数OTH上海期货交易所商品指数200708101000.0020161201

9509 rows × 8 columns

利用 pandas.Series.str.contains 进行模糊匹配

pandas.Series.str.contains 返回值是 Boolean 型

# 比如匹配 df_index['ts_code'] 中包含字符串 "00000" 的数据
#
df_index.ts_code.str.contains('00000', case=False)
0       True
1       True
2       True
3       True
4       True
       ...  
946    False
947    False
948    False
949    False
950    False
Name: ts_code, Length: 9509, dtype: bool
# 也可以用正则表达式作为输入,比如以 "96" 开头的代码
# 为了突出数据的选择结果,输出匹配筛选出的数据
#
df_index[df_index.ts_code.str.contains('^96', case=False)]
ts_codenamemarketpublishercategorybase_datebase_pointlist_date
3193960400.MIMSCI秘鲁MSCIMSCI规模指数19921231100.0None
3194961600.MIMSCI波兰MSCIMSCI规模指数19921231100.0None
3195962000.MIMSCI葡萄牙MSCIMSCI规模指数19871231100.0None
# 比如以 "h" 结尾的代码。 case=False 可以忽略大小写检查
#
df_index[df_index.ts_code.str.contains('h$', case=False)]
ts_codenamemarketpublishercategorybase_datebase_pointlist_date
0000001.SH上证指数SSE中证公司综合指数19901219100.0019910715
1000002.SH上证A指SSE中证公司综合指数19901219100.0019920221
2000003.SH上证B指SSE中证公司综合指数19920221100.0019920221
3000004.SH上证工业类指数SSE中证公司综合指数199304301358.7819930503
4000005.SH上证商业类指数SSE中证公司综合指数199304301358.7819930503
...........................
621SCH072D.SCH上清所5-7年信用债综合指数(净价)OTH上海清算所债券指数20161226100.0020161226
622SCH07A.SCH上清所0-1年信用债综合指数OTH上海清算所债券指数20161226100.0020161226
623SCH07B.SCH上清所1-3年信用债综合指数OTH上海清算所债券指数20161226100.0020161226
624SCH07C.SCH上清所3-5年信用债综合指数OTH上海清算所债券指数20161226100.0020161226
625SCH07D.SCH上清所5-7年信用债综合指数OTH上海清算所债券指数20161226100.0020161226

724 rows × 8 columns

下面用同样代码试试指数代码输入和指数名称输入

先输入指数代码试试

# 输入
input_string = input('输入指数代码或指数名称:').strip()
输入指数代码或指数名称:39996
# 在指数代码和指数名称这两列数据中进行模糊匹配
#
df_info = df_index[df_index.ts_code.str.contains(input_string, case=False) | df_index.name.str.contains(input_string, case=False)]
df_info
ts_codenamemarketpublishercategorybase_datebase_pointlist_date
390399960.SZ中证龙头SZSE中证公司主题指数200412311000.020100209
391399961.SZ中证上游SZSE中证公司主题指数200412311000.020100416
392399962.SZ中证中游SZSE中证公司主题指数200412311000.020100416
393399963.SZ中证下游SZSE中证公司主题指数200412311000.020100416
394399964.SZ中证新兴SZSE中证公司主题指数200412311000.020100430
395399965.SZ中证800地产SZSE中证公司二级行业指数200412311000.020140404
396399966.SZ中证800证保SZSE中证公司主题指数200412311000.020140404
397399967.SZ中证军工SZSE中证公司主题指数200412311000.020131226
398399968.SZ300周期SZSE中证公司主题指数200412311000.020100528
399399969.SZ300非周SZSE中证公司主题指数200412311000.020100528

再输入指数名称试试

# 输入
input_string = input('输入指数代码或指数名称:').strip()
输入指数代码或指数名称:中小
# 在指数代码和指数名称这两列数据中进行模糊匹配
#
df_info = df_index[df_index.ts_code.str.contains(input_string, case=False) | df_index.name.str.contains(input_string, case=False)]
df_info
ts_codenamemarketpublishercategorybase_datebase_pointlist_date
43000046.SH上证中小SSE中证公司规模指数200312311000.020090703
78000091.SH沪财中小SSE中证公司主题指数200412311000.020110406
197000867.SH港中小企SSE中证公司主题指数201411143000.020150826
330h00046.SH上证中小全收益SSE中证公司规模指数200312311000.020090703
365h00091.SH沪财中小全收益SSE中证公司主题指数200412311000.020110406
...........................
3056711068L.MI全球市场大中小盘(含部分A股)(人民币)MSCIMSCI其他NoneNaNNone
3091718874.MIMSCI中国全股中小盘MSCIMSCI规模指数NoneNaNNone
3092718875.MIMSCI中国A股国际中小盘MSCIMSCI规模指数NoneNaNNone
1801002.SI申万中小板SW申万研究其他200407051000.0None
874SPHCMSHP.SPI标普香港上市中国中小盘精选指数OTH标准普尔公司其他NoneNaNNone

482 rows × 8 columns

有了指数代码,就可以获得指数日线数据了

# 获取指数日线数据
#
index_code = df_info.iloc[0]['ts_code']
df = pro.index_daily(ts_code=index_code)
df.rename(columns={'vol': 'vol(手)', 'amount': 'amount(千元)'}, inplace=True)
df
ts_codetrade_datecloseopenhighlowpre_closechangepct_chgvol(手)amount(千元)
0000046.SH202104304460.15214482.30294482.30294431.38034502.2544-42.1023-0.93511.531943e+081.799518e+08
1000046.SH202104294502.25444486.19594507.03114466.09254486.347315.90710.35461.327776e+081.583016e+08
2000046.SH202104284486.34734443.22794486.34734430.39214450.530535.81680.80481.131329e+081.410433e+08
3000046.SH202104274450.53054446.03624460.28834412.10654449.31801.21250.02731.191778e+081.397632e+08
4000046.SH202104264449.31804490.22664526.97744446.67324479.6079-30.2899-0.67621.350744e+081.692510e+08
....................................
3963000046.SH20050110835.8030828.6420835.8030825.4270829.30406.49900.78373.249806e+062.089842e+06
3964000046.SH20050107829.3040825.9590838.8730824.4510826.89702.40700.29114.056519e+062.608160e+06
3965000046.SH20050106826.8970834.6070834.6070824.4180834.2200-7.3230-0.87783.561436e+062.180104e+06
3966000046.SH20050105834.2200822.2770836.8670821.9170822.686011.53401.40203.827764e+062.440814e+06
3967000046.SH20050104822.6860832.4610832.4610821.3520NaNNaNNaN2.765870e+061.752842e+06

3968 rows × 11 columns


点击 https://tushare.pro/register?reg=414428 ,免费注册后即可获取 tushare 的 token,就可以下载各种金融数据了。



标签:index,中证,指数,df,ts,DataFrame,False,多列,数据
来源: https://blog.csdn.net/hamagudu/article/details/116308173