在过去的几天里,我从我们的数据库中阅读了大量的帖子。由于我在python、pandas和numpy方面的技能有限,我不确定是否能找到我想要的答案。所以请你看看我的情况,看看我能做些什么。对于搜索结果中的中文字符,我很抱歉。
我目前正在写一些个人使用的定量分析。我通过tushare-pro检索了一个csv文件,它是一个3825行的数据帧。
df1 = pd.DataFrame(pd.read_csv(stock_stats_ts.csv))
data1 = np.array(df1.loc[:,:])
返回
[[300826 'N测绘' '建筑工程' ... 41.16 16.85 40171.0]
[2770 '科迪乳业' '乳制品' ... 21.05 4.38 47133.0]
[2503 '搜于特' '服饰' ... 8.6 3.08 65664.0]
...
[2260 '*ST德奥' '家用电器' ... 23.08 3.03 24704.0]
[995 '*ST皇台' '白酒' ... 68.05 -35.24 10275.0]
[939 '*ST凯迪' '新型电力' ... 10.79 -74.92 79373.0]]
然后我将范围缩小到我想要的东西,比如code/name/esp/pb/roe
df2 = df1.loc[:,['code','name','esp','pb','npr']]
data2 = np.array(df1.loc[:,:])
返回
[[300826 'N测绘' 1.08 2.79 16.85]
[2770 '科迪乳业' 0.03 2.13 4.38]
[2503 '搜于特' 0.098 2.17 3.08]
...
[2260 '*ST德奥' 0.034 0.0 3.03]
[995 '*ST皇台' -0.079 0.0 -35.24]
[939 '*ST凯迪' -0.362 0.0 -74.92]]
我还有一个我想要的前一个交易日的股票名称列表
df3 = pd.DataFrame(pd.read_csv(candidates.csv))
data3 = np.array(df3.loc[:,['candidates']])
返回
[['维维股份']
['ST正源']
['美克家居']
['*ST金山']
['大有能源']
['好当家']
['贵州茅台']
['通策医疗']
['杭州解百']
['耀皮玻璃']
['梅花生物']
['金牌厨柜']
['继峰股份']
['胜利股份']
['渝 开 发']
['云南白药']
['中原环保']
['兴蓉环境']
['华闻集团']
['粤 水 电']
['濮耐股份']
['*ST东南']
['洪涛股份']
['达实智能']
['千红制药']
['闽发铝业']
['史丹利']
['加加食品']
['张家港行']
['国联水产']]
我确信的是,我的候选人肯定在df2name列中,然后,使用哪些代码行,以便我可以根据从df3获得的结果过滤我的df2?
感谢主任@ Regmi和@nimrodm,我的问题在pd.merge
上完美地解决了。然而,所有这些中文字符都是用'gbk‘编码的,这在MS Excel中是无法读取的。有什么建议可以把它们改成'utf8‘吗?
发布于 2020-04-05 11:50:20
您可以使用合并来解决您的这个问题。
new_df = df3.merge(df1, left_on='candidate', right_on='name', how='left')
这应该会给你你正在寻找的东西。
发布于 2020-04-06 00:49:49
最好的解决方案是连接这两个表(类似于SQL连接)。Pandas merge
执行内连接,这意味着您只选择在candidates数据框中具有匹配条目的行。
例如,result.csv
是
name,value
first,10
second,20
third,30
而selected.csv
是
candidates
first
third
将这两个文件读取为DataFrames (不需要转换为numpy数组):
data = pd.read_csv('result.csv')
selected = pd.read_csv('selected.csv')
并连接这两个参数( how
参数是可选的,因为inner
是merge
的默认值)
data.merge(selected, how='inner', left_on='name',right_on='candidates')
name value candidates
0 first 10 first
1 third 30 third
这将连接两个DataFrames,查找其中dataj、'name‘、== datak、'candidates’的值
另一种选择
另一种方法是直接选择name
(在我的示例中)位于给定列表中的行:
data[data['name'].isin(selected['candidates'])]
name value
0 first 10
2 third 30
这可能是低效的,除非候选列表非常短。
https://stackoverflow.com/questions/61037715
复制相似问题