如何使用Python或R从大量CSV中有效地提取唯一行

时间:2018-03-07 01:44:45

标签: python csv

我有一个巨大的CSV(1.4gb,超过1MM行)股票市场数据,我将用R处理。

该表看起来大致如此。对于每个股票代码,有数千行数据。

+--------+------+-------+------+------+
| Ticker | Open | Close | High | Low  |
+--------+------+-------+------+------+
| A      |  121 |   121 |  212 | 2434 |
| A      |   32 |    23 |   43 |  344 |
| A      |  121 |   121 |  212 | 2434 |
| A      |   32 |    23 |   43 |  344 |
| A      |  121 |   121 |  212 | 2434 |
| B      |   32 |    23 |   43 |  344 |
+--------+------+-------+------+------+

为了使处理和测试更容易,我使用此问题中提到的脚本将这个庞然大物分成更小的文件:How do I slice a single CSV file into several smaller ones grouped by a field?

该脚本将输出data_a.csvdata_b.csv等文件

但是,我还要创建index.csv,它只列出所有唯一的股票代码名称。

E.g。

+---------+
| Ticker  |
+---------+
| A       |
| B       |
| C       |
| D       |
| ...     |
+---------+

在处理庞大的文件大小时,有人可以推荐一种在R或Python中执行此操作的有效方法吗?

2 个答案:

答案 0 :(得分:1)

你可以遍历每个文件,获取每个文件的索引并创建所有索引的集合联合。

import glob

tickers = set()
for csvfile in glob.glob('*.csv'):
    data = pd.read_csv(csvfile, index_col=0, header=None)  # or True, however your data is set up
    tickers.update(data.index.tolist())

pd.Series(list(tickers)).to_csv('index.csv', index=False)

答案 1 :(得分:0)

您可以从文件名中检索索引:

(index <- data.frame(Ticker = toupper(gsub("^.*_(.*)\\.csv",
                                           "\\1",
                                           list.files()))))
##   Ticker
## 1      A
## 2      B

write.csv(index, "index.csv")