首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Python Pandas -如何将数据从一个数据帧匹配到另一个数据帧

Python Pandas -如何将数据从一个数据帧匹配到另一个数据帧
EN

Stack Overflow用户
提问于 2020-12-12 16:18:27
回答 2查看 74关注 0票数 0

我有两个与股票及其价格相关的数据帧,我试图交叉匹配每个数据帧中的数据。

df1 =每个用户选择了多个股票的数据库:

代码语言:javascript
运行
AI代码解释
复制
  Username Stock 1 Stock 2
0   JB3004    TSLA    MSFT
1   JM3009    SHOP    SPOT
2   DB0208    TWTR    MSFT
3   AB3011    TWTR    PTON
4   CB3004    MSFT    TSLA

df2 =每只股票的今天收盘价:

代码语言:javascript
运行
AI代码解释
复制
               TWTR      SPOT      PTON      SHOP      MSFT      TSLA
Date           Adj Close Adj Close Adj Close Adj Close Adj Close Adj Close
2020-12-11     51.44     341.22     117.1   1057.87    213.26    609.99

我尝试将df1中每个用户的相关股票与df2中的调整收盘价进行匹配,这样我就可以为每个用户选择的股票打印一个具有正确收盘价的df3

我该怎么做呢?我试过的所有东西都无法接近,所以我需要一些帮助!

EN

回答 2

Stack Overflow用户

发布于 2020-12-13 12:11:17

我也遇到过类似的问题。然后我有了一个解决方案,我正在与你分享。希望这篇文章能帮你找到答案。要查看我的解决方案,请单击github

创建df1

代码语言:javascript
运行
AI代码解释
复制
data1 = {"Username" : ["JB3004", "JM3009", "DB0208", "AB3011", "CB3004"],
      "Stock_1" : ["TSLA", "SHOP", "TWTR", "TWTR", "MSFT"],
      "Stock_2" : ["MSFT", "SPOT", "MSFT", "PTON", "TSLA"]}

df1 = pd.DataFrame(data=data1)
df1.head()
代码语言:javascript
运行
AI代码解释
复制
   Username Stock_1 Stock_2
0   JB3004  TSLA    MSFT
1   JM3009  SHOP    SPOT
2   DB0208  TWTR    MSFT
3   AB3011  TWTR    PTON
4   CB3004  MSFT    TSLA

将宽格式转换为长格式数据

代码语言:javascript
运行
AI代码解释
复制
df1_1 = pd.wide_to_long(df1, stubnames='Stock_', i='Username', j='Stock_num')
df1_1.reset_index(inplace=True)
df1_1
代码语言:javascript
运行
AI代码解释
复制
   Username Stock_num   Stock_
0   JB3004     1        TSLA
1   JM3009     1        SHOP
2   DB0208     1        TWTR
3   AB3011     1        TWTR
4   CB3004     1        MSFT
5   JB3004     2        MSFT
6   JM3009     2        SPOT
7   DB0208     2        MSFT
8   AB3011     2        PTON
9   CB3004     2        TSLA

将列名Stock_重命名为Stocks

代码语言:javascript
运行
AI代码解释
复制
df1_1.rename(columns={"Stock_": "Stocks"}, inplace=True)
df1_1

创建与df2匹配的df2

closing_price.csv文件包含收盘价数据

代码语言:javascript
运行
AI代码解释
复制
# closing_price.csv
,TWTR,SPOT,PTON,SHOP,MSFT,TSLA
Date,Adj Close,Adj Close,Adj Close,Adj Close,Adj Close,Adj Close
2020-12-11,51.44,341.22,117.1,1057.87,213.26,609.99

加载df2

代码语言:javascript
运行
AI代码解释
复制
df2 = pd.read_csv("closing_price.csv", index_col=None)
df2.head()
代码语言:javascript
运行
AI代码解释
复制
Unnamed: 0       TWTR    SPOT         PTON        SHOP        MSFT        TSLA
0      Date   Adj Close Adj Close   Adj Close   Adj Close   Adj Close   Adj Close
1   2020-12-11  51.44    341.22       117.1      1057.87      213.26      609.99

数据清理和转换

代码语言:javascript
运行
AI代码解释
复制
df2.set_index("Unnamed: 0", inplace = True)
df2.index.name = "Date"
df2.reset_index(inplace=True)
df2.drop([0], inplace=True)
df2.head()
代码语言:javascript
运行
AI代码解释
复制
       Date     TWTR    SPOT    PTON    SHOP    MSFT    TSLA
1   2020-12-11  51.44   341.22  117.1   1057.87 213.26  609.99

将宽格式转换为长格式数据

代码语言:javascript
运行
AI代码解释
复制
# Convert wide format to long format data
df2_1 = pd.melt(df2, id_vars=['Date'], value_vars=["TWTR", "SPOT", "PTON", "SHOP", "MSFT", "TSLA"], var_name="Stocks", value_name="Adj Close")
df2_1
代码语言:javascript
运行
AI代码解释
复制
       Date    Stocks   Adj Close
0   2020-12-11  TWTR    51.44
1   2020-12-11  SPOT    341.22
2   2020-12-11  PTON    117.1
3   2020-12-11  SHOP    1057.87
4   2020-12-11  MSFT    213.26
5   2020-12-11  TSLA    609.99

现在,df1_1和df2_1如下:

代码语言:javascript
运行
AI代码解释
复制
df1_1
代码语言:javascript
运行
AI代码解释
复制
   Username Stock_num   Stocks
0   JB3004     1         TSLA
1   JM3009     1         SHOP
2   DB0208     1         TWTR
3   AB3011     1         TWTR
4   CB3004     1         MSFT
5   JB3004     2         MSFT
6   JM3009     2         SPOT
7   DB0208     2         MSFT
8   AB3011     2         PTON
9   CB3004     2         TSLA
代码语言:javascript
运行
AI代码解释
复制
df2_1
代码语言:javascript
运行
AI代码解释
复制
      Date     Stocks   Adj Close
0   2020-12-11  TWTR    51.44
1   2020-12-11  SPOT    341.22
2   2020-12-11  PTON    117.1
3   2020-12-11  SHOP    1057.87
4   2020-12-11  MSFT    213.26
5   2020-12-11  TSLA    609.99

合并"Stocks“列上的df1_1和df2_1

代码语言:javascript
运行
AI代码解释
复制
# Merge df1_1 and df2_1 on column "Stocks"
df3 = pd.merge(df1_1, df2_1, on='Stocks')
df3
代码语言:javascript
运行
AI代码解释
复制
   Username Stock_num   Stocks  Date       Adj Close
0   JB3004     1        TSLA    2020-12-11  609.99
1   CB3004     2        TSLA    2020-12-11  609.99
2   JM3009     1        SHOP    2020-12-11  1057.87
3   DB0208     1        TWTR    2020-12-11  51.44
4   AB3011     1        TWTR    2020-12-11  51.44
5   CB3004     1        MSFT    2020-12-11  213.26
6   JB3004     2        MSFT    2020-12-11  213.26
7   DB0208     2        MSFT    2020-12-11  213.26
8   JM3009     2        SPOT    2020-12-11  341.22
9   AB3011     2        PTON    2020-12-11  117.1

重新排列列

代码语言:javascript
运行
AI代码解释
复制
# Rearrange columns
df3.set_index(["Date"], inplace=True)
df3.reset_index(inplace=True)
df3
代码语言:javascript
运行
AI代码解释
复制
       Date    Username   Stock_num Stocks  Adj Close
0   2020-12-11  JB3004       1      TSLA    609.99
1   2020-12-11  CB3004       2      TSLA    609.99
2   2020-12-11  JM3009       1      SHOP    1057.87
3   2020-12-11  DB0208       1      TWTR    51.44
4   2020-12-11  AB3011       1      TWTR    51.44
5   2020-12-11  CB3004       1      MSFT    213.26
6   2020-12-11  JB3004       2      MSFT    213.26
7   2020-12-11  DB0208       2      MSFT    213.26
8   2020-12-11  JM3009       2      SPOT    341.22
9   2020-12-11  AB3011       2      PTON    117.1
代码语言:javascript
运行
AI代码解释
复制
# Reshaping or pivoting data based on column values
df = df3.pivot(index="Username", columns="Stock_num", values=["Stocks", "Adj Close"])
df
代码语言:javascript
运行
AI代码解释
复制
           Stocks        Adj Close
Stock_num 1      2       1       2
Username                
AB3011  TWTR    PTON    51.44   117.1
CB3004  MSFT    TSLA    213.26  609.99
DB0208  TWTR    MSFT    51.44   213.26
JB3004  TSLA    MSFT    609.99  213.26
JM3009  SHOP    SPOT    1057.87 341.22
票数 0
EN

Stack Overflow用户

发布于 2020-12-13 13:05:05

刚看到这个,我想我应该试一试。

在df2上使用pandas.DataFrame.stack()将所有内容与df1对齐。如果需要,可以重命名一些字段。

代码语言:javascript
运行
AI代码解释
复制
df2t = df2.stack().reset_index().rename(
        columns={
                "level_0":"date",
                "level_1":"stock",
                0:"closing_price",
                },
        )

df2t = df2t.loc[df2t["date"] != "Date", :]

数据-

代码语言:javascript
运行
AI代码解释
复制
          date stock closing_price
6   2020-12-11  TWTR         51.44
7   2020-12-11  SPOT        341.22
8   2020-12-11  PTON         117.1
9   2020-12-11  SHOP       1057.87
10  2020-12-11  MSFT        213.26
11  2020-12-11  TSLA        609.99

df1上的pandas.melt()

代码语言:javascript
运行
AI代码解释
复制
df1m = pd.melt(df1, id_vars=["username"], value_vars=["Stock 1", "Stock 2"])

数据-

代码语言:javascript
运行
AI代码解释
复制
  username variable value
0   JB3004  Stock 1  TSLA
1   JM3009  Stock 1  SHOP
2   DB0208  Stock 1  TWTR
3   AB3011  Stock 1  TWTR
4   CB3004  Stock 1  MSFT
5   JB3004  Stock 2  MSFT
6   JM3009  Stock 2  SPOT
7   DB0208  Stock 2  MSFT
8   AB3011  Stock 2  PTON
9   CB3004  Stock 2  TSLA

合并数据帧。

代码语言:javascript
运行
AI代码解释
复制
df = pd.merge(df1m, df2t, left_on="value", right_on="stock", sort=False)

数据-

代码语言:javascript
运行
AI代码解释
复制
  username variable value        date stock closing_price
0   JB3004  Stock 1  TSLA  2020-12-11  TSLA        609.99
1   CB3004  Stock 2  TSLA  2020-12-11  TSLA        609.99
2   JM3009  Stock 1  SHOP  2020-12-11  SHOP       1057.87
3   DB0208  Stock 1  TWTR  2020-12-11  TWTR         51.44
4   AB3011  Stock 1  TWTR  2020-12-11  TWTR         51.44
5   CB3004  Stock 1  MSFT  2020-12-11  MSFT        213.26
6   JB3004  Stock 2  MSFT  2020-12-11  MSFT        213.26
7   DB0208  Stock 2  MSFT  2020-12-11  MSFT        213.26
8   JM3009  Stock 2  SPOT  2020-12-11  SPOT        341.22
9   AB3011  Stock 2  PTON  2020-12-11  PTON         117.1

进行一些清理,然后旋转以获得可用的结果

代码语言:javascript
运行
AI代码解释
复制
df = df.drop("value", axis=1).rename(columns={"variable": "holding_id"})
df = df.pivot(index="username", columns="holding_id", values=["stock", "closing_price"]).rename(columns=lambda x: x.strip())

数据-

代码语言:javascript
运行
AI代码解释
复制
             stock         closing_price        
holding_id Stock 1 Stock 2       Stock 1 Stock 2
username                                        
AB3011        TWTR    PTON         51.44   117.1
CB3004        MSFT    TSLA        213.26  609.99
DB0208        TWTR    MSFT         51.44  213.26
JB3004        TSLA    MSFT        609.99  213.26
JM3009        SHOP    SPOT       1057.87  341.22

使用多索引选择数据非常简单

代码语言:javascript
运行
AI代码解释
复制
df.loc[:,"stock"]["Stock 1"]

数据-

代码语言:javascript
运行
AI代码解释
复制
username
AB3011    TWTR
CB3004    MSFT
DB0208    TWTR
JB3004    TSLA
JM3009    SHOP
Name: Stock 1, dtype: object

或者,包含目标选择的用户名:

代码语言:javascript
运行
AI代码解释
复制
df.loc["AB3011","stock"]["Stock 1"]

数据-

代码语言:javascript
运行
AI代码解释
复制
'TWTR'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65267138

复制
相关文章
运维所需技能体系
产品研发有自己的生命周期: 设计阶段---开发阶段---测试阶段---部署阶段---线上运行阶段---下线或者回滚阶段。
互联网老辛
2018/12/06
9220
python生成项目所需依赖文件
在开发或者在github上clone python项目时,我们经常能看到他们工程的根目录下有一个requirements.txt文件,并且在Readme中介绍使用前需要运行一些命令 这个时什么意思呢? 开发者希望我们能快速配置项目所需要的环境,所以我们需要这个很重要的文件
earthchen
2020/09/24
8140
软件工程 – 专业所需工具
非常好用的开源C/C++ IDE,与mingw搭配使用。替代vc6.0的免费解决方案。
ApacheCN_飞龙
2019/02/15
1.6K0
IOS应用提交所需的ICON
如果提交的ipa包中,未包含必要的Icon就会收到类似的通知,为什么偏偏是Icon-76呢?
meteoric
2018/11/19
8690
mall学习所需知识点
《IntelliJ-IDEA-Tutorial》:https://github.com/judasn/IntelliJ-IDEA-Tutorial
macrozheng
2019/07/22
4990
怎样快速搜索自己所需的资料?
摘要:我不敢保证现在100%的大学生不会使用互联网快速搜索自己所需的资料,但我绝对敢保证有70%~90%大学生不会使用此方法进行快速搜索自己所需的资料。本文以百度为例,分享三个重要技巧。 一、关键词:
用户1756920
2018/06/20
1.6K0
Eclipse中执行Hbase所需jar包
Eclipse中执行Hbase程序需要导入的jar包如下: 1 Hadoop全部jar包 2 Hbase部分jar包     Hbasejar包不能多也不能少,多了会冲突,少了会提醒找不到相应类,Hb
闵开慧
2018/03/30
1.5K0
Eclipse中执行Hbase所需jar包
ios上传appStore所需图片各种尺寸
主要尺寸为(以像素为单位):40 , 60 ,58,87,80,120,180,app store上显示的icon图标尺寸:1024
honey缘木鱼
2018/08/10
5.1K0
ios上传appStore所需图片各种尺寸
JNI所需的C语言知识小结
介绍 作为Android开发人员,会java是必须的,但是一般从事android业务逻辑开发的对C/C++的了解估计仅限于大学里不走心的课程。。。所以参考视频和资料小结一下JNI所需的c语言知识~ 基本数据类型 数据类型 boolean byte char short int long double float void signed unsigned java 1 1 2 2 4 8 8 4 无 无 C 无 无 1 2 4 4 8 4 有符号 无符号 sizeof()函数是用来测量某个类型所占的字节
用户1665735
2018/06/20
1.2K0
软件测试所需要掌握的技能
1.在测试中最重要的文档,他是测试工作的核心,是一组在测试时输入输出的标准,是软件需求的具体对照。编写测试用例,是测试人员的基本功,真正能写好的人并不多。
用户7880705
2020/12/28
1K0
【技能】数据科学家所需技能
小编邀请您,先思考: 1 您认为数据科学家需要具备哪些技能? 2 您擅长那些技能? 数据科学家所需具体技能,罗列如下: 1 数据分析技能 数据清洗 运用合适的统计知识和方法来分析数据 运用机器学习算
陆勤_数据人网
2018/02/28
7250
【技能】数据科学家所需技能
gsea或者gsva所需要的gmt文件
不得不说,数据资源真心丰富啊:The 32880 gene sets in the Molecular Signatures Database (MSigDB) are divided into 9 major collections, and several sub-collections.
生信技能树
2022/04/15
3.2K0
gsea或者gsva所需要的gmt文件
ChatGPT 的 AskYourPDF 插件所需链接如何获取?
目前 ChatGPT 主要有两款 PDF 对话插件,一个是 AskYourPDF 一个是 ChatWithPDF(需 ChatGPT Plus),他们都可以实现给一个公共的PDF 链接,然后进行持续对话,对读论文,阅读 PDF 格式的文档非常有用。
明明如月学长
2023/05/22
3.6K0
ChatGPT 的 AskYourPDF 插件所需链接如何获取?
高效编程所需要做的那点事
聊聊如果才能高效编程 计划(Plan) 所谓Plan,其实就是对应于编程中的设计阶段,当然,这里的Plan并不像设计那样重量级。它要求我们程序员在正式编程前至少要考虑一下下面的问题: 你这个程序,工具或是项目的目的,究竟是用来干什么的。你只有知道做什么,要达到什么样的目的 你这个程序,工具或是项目的目的,究竟是用来干什么的。你只有知道做什么,要达到什么样的目的,你才能做得对,做得好。 需要有什么样的功能。需要你给出来个功能列表。这样可以保证我们不会遗露了什么。准备好一些技术难题的前期调查
码神联盟
2018/04/02
5100
车载网络: OMNet++所需的组件支持
安装过程详见我的另两篇博客:Ubuntu: 安装 OMNeT++ 仿真工具、车载网络: OMNeT++安装CAN协议 。
JNingWei
2018/09/27
1.1K0
【Struts】配置Struts所需类库详细解析
在 Struts框架配置详情 中,谈到了使用Struts所必须的Jar文件。这里对使用到的Jar文件进行详细解析。
陈树义
2022/04/29
2910
【Struts】配置Struts所需类库详细解析
你所需要掌握的问题排查知识
由于业务应用 bug(本身或引入第三方库)、环境原因、硬件问题等原因,线上服务出现故障 / 问题几乎不可避免。例如,常见的现象包括请求超时、用户明显感受到系统发生卡顿等等。
测试开发技术
2020/01/17
1.4K0
你所需要掌握的问题排查知识
SSM整合所需的maven配置文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" x
说故事的五公子
2019/10/24
6750
点击加载更多

相似问题

缺少所需参数

14

Web所需参数

53

缺少所需参数

22

缺少所需参数

11

所需隐含参数

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档