[英]Pandas read_csv with a filter function to choose special row
随着世界的发展,数据变得越来越大。 一般情况下,如果我们不使用集群,我们自己的 MacBookPro 是无法处理大量数据的。
那么 Pandas 是否有 read_csv function 的过滤器? 这样,我可以选择一次加载指定行的数据,而不是一次将所有数据加载到memory中(类似于groupby后处理分组数据)。 例如:
桌子:
A B C D E F
a1 b1 0 1 1 0
a2 b1 1 0 0 1
...
an bm 0 1 1 0
预期的:
# exptec function like that
def my_filter(line):
line_list = line.strip().split(Delimiter)
if len(line_list) != 6:
return None
if line_list[0] != 'a1' and line_list[1] != 'b1':
return None
return line
# So we can read very little data at once,Even MacBookPro can handle.
# If read_csv function supports such a function
df = pd.read_csv(table_name, filter=my_filter)
我搜索了很多文件,但似乎没有找到。 如果真的不存在,希望Pandas在未来的某一天能支持
您可以使用 open 内置来过滤您需要的行,最后使用 read_csv 读取修改后的文件:
from io import StringIO
out = StringIO() #you can also save the output into a different file
with open('file.csv') as f_in:
for line in f_in:
line_list = line.strip().split(",")
if len(line_list) == 6 and (line_list[0] != 'a1' and line_list[1] != 'b1'):
out.write(line)
out.seek(0)
print(pd.read_csv(out))
或者,如果您不想通过 position 而是通过行内的成员资格进行检查,则可以使用set
:
from io import StringIO
out = StringIO()
with open('file.csv') as f_in:
for line in f_in:
line_list = line.strip().split(",")
if len(line_list) == 6 and (set(['a1','b1']).isdisjoint(line_list)):
out.write(line)
out.seek(0)
print(pd.read_csv(out))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.