Python - 比较2个不同的csv / txt文件中的2列并找到匹配项

时间:2016-08-07 13:45:11

标签: python csv pandas numpy

我想在公告日期获得股票的价格。所以我需要返回文件2中包含文件1中日期的行。

  • 我有两个csv文件,股票价格超过1000
    • 文件1'公告日期'包含:
    • 公告日期; TICKER
    • 20151116; UN EQUITY
    • 20141117; UN EQUITY
    • 20131114;联合国股权 ...
  • file 2'price'包含自2005年以来每只股票每个交易日的价格:
  • 超过1mio。线
  • DATE; TICKER; PRICE
  • 20151231; A UN EQUITY; 41.81
  • 20151230; UN EQUITY; 42.17
  • 20151229;联合国股权; 42.36 ...

    data_prices = "data_prices.csv"
    data_ancment = "data_static.csv"
    with open(data_ancment, 'rt') as a, open(data_prices, 'rt') as b:
    reader1 = csv.reader(a, delimiter=';')
    reader2 = csv.reader(b, delimiter=';')
    
    for row2 in reader2:
        for row1 in reader1:
            if row1[0] == row2[0]:
                print(row2[2])
    

我不知道是否可以这样做,因为文件很大或者numpy或pandas是更好/更快的选项。

提前感谢任何提示。

2 个答案:

答案 0 :(得分:0)

pandas DataFrames上执行这当然是一项非常常见的任务。无论表演是否轻松,都可以轻松测试;如果我正确理解你的问题,你只想在日期上合并,pandas的相应部分将是以下(你应该注意到我改变了你的日期,以便有一个非平凡的重叠)

In [1]: import pandas as pd

In [2]: prices = pd.read_csv('data_prices.csv', sep=';')

In [3]: ancment = pd.read_csv('data_static.csv', sep=';')

In [4]: combined = pd.merge(prices, ancment, left_on='ANNOUNCEMENT DATES', right_on='DATE')

In [5]: prices.head()
Out[5]: 
   ANNOUNCEMENT DATES       TICKER
0            20151116  A UN EQUITY
1            20141117  A UN EQUITY
2            20131114  A UN EQUITY

In [6]: ancment.head()
Out[6]: 
       DATE       TICKER  PRICE
0  20151116  A UN EQUITY  41.81
1  20151230  A UN EQUITY  42.17
2  20151229  A UN EQUITY  42.36

In [7]: combined.head()
Out[7]: 
   ANNOUNCEMENT DATES     TICKER_x      DATE     TICKER_y  PRICE
0            20151116  A UN EQUITY  20151116  A UN EQUITY  41.81

合并这两个框架可以完成很多任务 - 例如,您可能只希望只有一个日期列,因为无论如何都要设置为同意。有关完整的可能性集,请参阅http://pandas.pydata.org/pandas-docs/stable/merging.html

答案 1 :(得分:0)

您可以使用dictionaries之类的哈希值。

prices = "prices.csv"
ancment = "ancment.csv"

with open(ancment, 'rt') as a, open(prices, 'rt') as b:
    reader1 = csv.reader(a, delimiter=';')
    reader2 = csv.reader(b, delimiter=';')

dictionary = dict()

for row2 in reader2:
    dictionary[row2[0]] = list()

for row1 in reader1:
    try:
        dictionary[row1[0]].append(row1)
    except KeyError:
        pass

for k,v in dictionary.iteritems():
    print k,v