所以我有这个巨大的CSV,我制作了一个测试脚本来查看行数,它返回大约2400万行。我想提取具有相同CIK编号的行数,并以单独的CSV传输该数据。
因此,另一个文件中的所需输出将是:
CIK号码:具有该CIK号码的IP号码。
我有一些想法,但是它们效率不高,因此该脚本没有用,因为花了很长时间才通过csv。那么有人遇到了和我一样的类似问题吗?
我应该用熊猫做这个吗,任何建议都会有很大帮助!
CSV示例:
答案 0 :(得分:2)
使用计数器如何?
import collections, csv
with open("big.csv") as csvfile:
counter = collections.Counter(row["cik"] for row in csv.DictReader(csvfile))
with open("out.csv", "w") as outfile:
writer = csv.writer(outfile)
writer.writerow(("cik", "count"))
for cik, count in counter.items():
writer.writerow((cik, count))
此操作的内存开销将取决于有多少CIK,而不取决于多少行。我不知道那是多少,所以我不知道这是否会成为问题。
答案 1 :(得分:1)
您可以使用pandas
到groupby
列中的CIK
,然后使用size()
获得CIK
值的总数。
例如,
import pandas as pd
df = pd.read_csv('name.csv')
ndf = df.groupby('CIK').size()
ndf.to_csv("CIK_number.csv")
我想我可能误解了您想要的输出。如果您希望CIK,IP对按CIK出现的次数进行配对,
df = pd.DataFrame({'CIK': ['102', '102', '103', '103', '104'], 'IP':['103.92.134', '103.92.134', '103.92.135', '103.92.136', '105.32.134'], 'C1': [1, 2, 3, 4,5 ], 'C2':[1,0,0,1,0]})
ndf = df.groupby(['CIK','IP'])['CIK'].size().reset_index()
ndf.rename(columns={0: 'count'}, inplace=True)
### returns
CIK IP count
0 102 103.92.134 2
1 103 103.92.135 1
2 103 103.92.136 1
3 104 105.32.134 1
要在pandas
中读取大型CSV文件,请执行
chunks = []
for chunk in pd.read_csv('csv_name.csv', chunksize = 100):
chunks.append(chunk)
df = pd.concat(chunks)
答案 2 :(得分:-1)
您可以使用熊猫,但效率不高:
import pandas
df = pandas.read_csv('my.csv')
但是快速而又肮脏的方法是简单地流传输文件并使用简单的字符串匹配来提取,然后编写新文件:
with open("my.csv") as infile:
for line in infile:
if "CIK_number" in line :
do_something_with(line)