【问题标题】:Difficulty in merging two dataframes on two columns, ticker and date难以在两列(股票代码和日期)上合并两个数据框
【发布时间】:2020-01-11 23:56:41
【问题描述】:

我查看了许多对此类问题的回复。我正在尝试按列合并两个文件,并且数据框仅共享代码和日期,因此如果我设置how='left',它会显示df_US[US_columns] 的数据和df_SEDOL_ESG[ESG_columns] 的标题列,但没有df_SEDOL_ESG[ESG_columns] 的数据。

同样,如果您设置how = 'right',则显示相反。我尝试设置 how = 'outer' 并且不会合并数据框而是单独列出它们。

在代码下方,我附上了示例数据框和数据类型,因为我想确保日期列采用日期时间格式。任何指导表示赞赏。

import numpy as np
import pandas as pd

path0 = 'K:/QuantTest/Data/ESG/'
path1 = 'K:/QuantTest/Data/US/'


def US_ESG():    

    df_US = pd.read_csv(path1 + 'df_US_weekly_expectationt.csv', dtype={'ticker':'str'})
    df_US.rename(columns = {'Date': 'date'}, inplace = True)
    df_US['date'] = pd.to_datetime(df_US['date'], format='%m/%d/%Y', errors = 'coerce')

    df_SEDOL_ESG = pd.read_csv(path0 + 'SEDOL_ESGt.csv', dtype = {'ticker':'str'})
    df_SEDOL_ESG.rename(columns = {'Ticker':'ticker'}, inplace=True)
    df_SEDOL_ESG['date'] = pd.to_datetime(df_SEDOL_ESG['date'], format='%m/%d/%Y', errors = 'coerce')

    US_columns = ['ticker', 'date', 'volume', 'closing_price']
    ESG_columns = ['ticker', 'date','AllCategories_Insight','AllCategories_CategoryVolumeTTM']

    df_US_ESG = df_US[US_columns].merge(df_SEDOL_ESG[ESG_columns], how='left', on = ['ticker', 'date'])

    df_US_ESG.to_csv(path0 + 'US_ESGt.csv', index = False)


if __name__ == "__main__":

   US_ESG()  

【问题讨论】:

  • 我可能认为合并选项不适用于您的情况。每行的ticker和data cols中的所有数据是否相同?你能提供一些 2 df 的数据行吗?
  • ticker date volume closing_price A 12/28/2018 2445101.5 65.96 AABA 12/28/2018 7113085.5 58.35 AAP 12/28/2018 1066813.625 155.46 AAPL 12/28/2018 43182216 156.23 ABC 12/28/2018 1286497.125 73.96
  • OrganizationTvlId ISIN Ownership SEDOL Ticker Company Name InstrumentCountry Sector Industry date AllCategories_Insight Materiality_Insight AllCategories_CategoryVolumeTTM Materiality_CategoryVolumeTTM 0002c46f-98ff-457e-83e0-47b466746572 US55027E1029 Public 2572109 A Luminex Corp. US Health Care Biotechnology 12/28/2018 56.12375097 58.27797253 4 3 0002c46f-98ff-457e-83e0-47b466746572 US55027E1029 公共 2572109 AABA Luminex Corp. 美国医疗保健生物技术 12/28/2018 56.37543414 58.48117502 4 3
  • 以上,我附上了数据框。 df_US 中的数据是 df_SEDOL_ESG 的子集。此外,两个数据框中的数据(不包括股票代码和日期)都不同,这就是我尝试合并它们的原因。我需要使用 df_US['volume'] 和 df_US['closing_price'] 来计算具有 AllCategory_CategoryVolumeTTM 的新项目。感谢您的帮助

标签: python dataframe


【解决方案1】:

如果你想合并 2 个数据框,像这样。 on 参数用作连接 kyes。 pandas doc

# before
df_US_ESG = df_US[US_columns].merge(df_SEDOL_ESG[ESG_columns], how='left', on = ['ticker', 'date'])

# after
df_US_ESG = pd.maerge(df_US[US_columns], df_SEDOL_ESG[ESG_columns], on = ['ticker', 'date'])

我的复制品是这样的。希望对您有所帮助。

# df1.csv
ticker,date,volume,closing_price
A,12/28/2018,2445101.5,65.96
AABA,12/28/2018,7113085.5,58.35
AAP,12/28/2018,1066813.625,155.46
AAPL,12/28/2018,43182216,156.23
ABC,12/28/2018,1286497.125,73.96

# df2.csv

OrganizationTvlId,ISIN,Ownership,SEDOL,ticker,Company_Name,InstrumentCountry,Sector,Industry,date,AllCategories_Insight,Materiality_Insight,AllCategories_CategoryVolumeTTM,Materiality_CategoryVolumeTTM
0002c46f-98ff-457e-83e0-47b466746572,US55027E1029,Public,2572109,A,Luminex_Corp.,US,Health_Care,Biotechnology,12/28/2018,56.12375097,58.27797253,4,3
0002c46f-98ff-457e-83e0-47b466746572,US55027E1029,Public,2572109,AABA,Luminex_Corp.,US,Health_Care,Biotechnology,12/28/2018,56.37543414,58.48117502,4,3

# python
df1 = pd.read_csv('df1.csv')
df2 = pd.read_csv('df2.csv'
df = pd.merge(df1, df2, on=['ticker', 'date'])
print(df)

# output
ticker  date    volume  closing_price   OrganizationTvlId   ISIN    Ownership   SEDOL   Company_Name    InstrumentCountry   Sector  Industry    AllCategories_Insight   Materiality_Insight AllCategories_CategoryVolumeTTM Materiality_CategoryVolumeTTM
0   A   12/28/2018  2445101.5   65.96   0002c46f-98ff-457e-83e0-47b466746572    US55027E1029    Public  2572109 Luminex_Corp.   US  Health_Care Biotechnology   56.123751   58.277973   4   3
1   AABA    12/28/2018  7113085.5   58.35   0002c46f-98ff-457e-83e0-47b466746572    US55027E1029    Public  2572109 Luminex_Corp.   US  Health_Care Biotechnology   56.375434   58.481175   4   3 

【讨论】:

  • 志摩,感谢您的帮助。当我使用您建议的代码时,我得到一个空数据。Empty DataFrame Columns: [ticker, date, volume, closing_price, AllCategories_Insight, AllCategories_CategoryVolumeTTM] Index: []
  • 这是我使用 how='outer'ticker date volume closing_price AllCategories_Insight AllCategories_CategoryVolumeTTM A 12/28/2018 2445101.5 65.96 AABA 12/28/2018 7113085.5 58.35 AAP 12/28/3.6258 12/28/2051 时的结果AAPL 12/28/2018 43182216 156.23 ABC 12/28/2018 1286497.125 73.96 A 12/28/2018 56.12375097 4 AABA 12/28/2018 56.37543414 4 AAP 12/28/2018 56.62049621 4 AAPL 12/28/2018 56.85911136 4 ABC 12 /28/2018 57.0914492 4 LMNX 12/28/2018 56.80139111 5
  • 所以我无法弄清楚为什么两个数据框没有合并。我什至定义了两个数据框并使用 df1 和 df2 作为您的示例,但仍然没有分辨率。感谢您的帮助。
  • I found a solution df = pd.merge(df1, df2, on=['ticker', 'date'],how='outer', validate = 'one_to_many', indicator=True, left_index = True, right_index = True)ticker date volume closing_price AllCategories_Insight AllCategories_CategoryVolumeTTM _merge A 12/28/2018 2445101.5 65.96 56.12375097 4 both AABA 12/28/2018 7113085.5 58.35 56.37543414 4 both AAP 12/28/2018 1066813.625 155.46 56.62049621 4 AAPL 12/28/2018 43182216 156.23 56.85911136 4 ABC 12/28/2018 2018 1286497.125 73.96 57.096 57.0914492 4 LMNLMNTLE LMNX 12/80 and lmnx 12/80 and lmnx 12/80> 82 and lm lmnx> 82 extly 12/80 and lm lmnx> 82
猜你喜欢
  • 2018-04-02
  • 1970-01-01
  • 2019-08-18
  • 2021-10-05
  • 1970-01-01
  • 2014-02-06
  • 2021-10-24
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多