Python 跨多个数据帧的计数值

Python 跨多个数据帧的计数值,python,pandas,csv,Python,Pandas,Csv,我有多个包含相同类型数据的csv文件。我想计算所有csv文件中某个列中某个值的出现次数(它们太大,无法作为一个文件处理)。如果将结果放在一个系列中,就像计算一个文件的出现次数一样,那就太好了。我怎样才能用熊猫做到这一点 例如: file 1 gender ------- man woman woman woman file 2 gender ------- man man woman woman Result man 3 woman 5 假设可以在内存中单独读取每个文件,则可

我有多个包含相同类型数据的csv文件。我想计算所有csv文件中某个列中某个值的出现次数(它们太大,无法作为一个文件处理)。如果将结果放在一个系列中,就像计算一个文件的出现次数一样,那就太好了。我怎样才能用熊猫做到这一点

例如:

file 1

gender
-------
man
woman
woman
woman


file 2

gender
-------
man
man
woman
woman


Result

 man 3
 woman 5

假设可以在内存中单独读取每个文件,则可以使用
collections.Counter
构建计数器列表

然后在最后一步中通过
sum
对它们进行聚合

from io import StringIO
import pandas as pd
from collections import Counter

file1 = StringIO("""gender
man
woman
woman
woman""")

file2 = StringIO("""gender
man
man
woman
woman""")

# replace file1, file2 with 'file1.csv', 'file2.csv'
lst = [Counter(pd.read_csv(f)['gender']) for f in [file1, file2]]

# aggregate list of Counter objects
res = sum(lst, Counter())

print(res)

Counter({'man': 3, 'woman': 5})

如果您甚至无法将一个文件加载到内存中,您可以使用
csv.reader
collections.defaultdict
逐行迭代并获得相同的结果。

假设您有一个包含要读取的文件路径的列表。然后,您可以在所有文件上循环,并将出现的条目存储在感兴趣的列中(例如
gender

您可以使用以静默方式执行分块和聚合

import dask.dataframe as dd

df = dd.read_csv('*.csv')  # use all csv files in directory

res = df['gender'].value_counts().compute()
这将返回一个序列a
pd.series.value\u计数


dask
解决方案利用块上的
pandas
算法,即使单个文件无法加载到内存中,也能正常工作。

只需读取csv和concat,并计算值\u counts这些文件太大,无法执行此操作,则您可以进行块读取,只需保留计数结果如果我这样做,输出仅显示最后一个文件的计数,而不是全部计数。@Stijn,这不是真的。如我的示例所示,它跨多个文件聚合。
import dask.dataframe as dd

df = dd.read_csv('*.csv')  # use all csv files in directory

res = df['gender'].value_counts().compute()