首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pandas Dataframe过滤合并结果。编码和解码问题

Pandas Dataframe过滤合并结果。编码和解码问题
EN

Stack Overflow用户
提问于 2020-04-05 11:35:58
回答 2查看 186关注 0票数 2

在过去的几天里,我从我们的数据库中阅读了大量的帖子。由于我在python、pandas和numpy方面的技能有限,我不确定是否能找到我想要的答案。所以请你看看我的情况,看看我能做些什么。对于搜索结果中的中文字符,我很抱歉。

我目前正在写一些个人使用的定量分析。我通过tushare-pro检索了一个csv文件,它是一个3825行的数据帧。

代码语言:javascript
运行
复制
df1 = pd.DataFrame(pd.read_csv(stock_stats_ts.csv))
data1 = np.array(df1.loc[:,:])

返回

代码语言:javascript
运行
复制
[[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

代码语言:javascript
运行
复制
df2 = df1.loc[:,['code','name','esp','pb','npr']]
data2 = np.array(df1.loc[:,:])

返回

代码语言:javascript
运行
复制
[[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]]

我还有一个我想要的前一个交易日的股票名称列表

代码语言:javascript
运行
复制
df3 = pd.DataFrame(pd.read_csv(candidates.csv))
data3 = np.array(df3.loc[:,['candidates']])

返回

代码语言:javascript
运行
复制
[['维维股份']
 ['ST正源']
 ['美克家居']
 ['*ST金山']
 ['大有能源']
 ['好当家']
 ['贵州茅台']
 ['通策医疗']
 ['杭州解百']
 ['耀皮玻璃']
 ['梅花生物']
 ['金牌厨柜']
 ['继峰股份']
 ['胜利股份']
 ['渝 开 发']
 ['云南白药']
 ['中原环保']
 ['兴蓉环境']
 ['华闻集团']
 ['粤 水 电']
 ['濮耐股份']
 ['*ST东南']
 ['洪涛股份']
 ['达实智能']
 ['千红制药']
 ['闽发铝业']
 ['史丹利']
 ['加加食品']
 ['张家港行']
 ['国联水产']]

我确信的是,我的候选人肯定在df2name列中,然后,使用哪些代码行,以便我可以根据从df3获得的结果过滤我的df2?

感谢主任@ Regmi和@nimrodm,我的问题在pd.merge上完美地解决了。然而,所有这些中文字符都是用'gbk‘编码的,这在MS Excel中是无法读取的。有什么建议可以把它们改成'utf8‘吗?

EN

回答 2

Stack Overflow用户

发布于 2020-04-05 11:50:20

您可以使用合并来解决您的这个问题。

代码语言:javascript
运行
复制
new_df = df3.merge(df1, left_on='candidate', right_on='name', how='left')

这应该会给你你正在寻找的东西。

票数 2
EN

Stack Overflow用户

发布于 2020-04-06 00:49:49

最好的解决方案是连接这两个表(类似于SQL连接)。Pandas merge执行内连接,这意味着您只选择在candidates数据框中具有匹配条目的行。

例如,result.csv

代码语言:javascript
运行
复制
name,value
first,10
second,20
third,30

selected.csv

代码语言:javascript
运行
复制
candidates
first
third

将这两个文件读取为DataFrames (不需要转换为numpy数组):

代码语言:javascript
运行
复制
data = pd.read_csv('result.csv')
selected = pd.read_csv('selected.csv')

并连接这两个参数( how参数是可选的,因为innermerge的默认值)

代码语言:javascript
运行
复制
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 (在我的示例中)位于给定列表中的行:

代码语言:javascript
运行
复制
data[data['name'].isin(selected['candidates'])]    

    name  value 
0  first     10
2  third     30

这可能是低效的,除非候选列表非常短。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61037715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档