Python 跨多个数据帧的计数值
我有多个包含相同类型数据的csv文件。我想计算所有csv文件中某个列中某个值的出现次数(它们太大,无法作为一个文件处理)。如果将结果放在一个系列中,就像计算一个文件的出现次数一样,那就太好了。我怎样才能用熊猫做到这一点 例如: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 假设可以在内存中单独读取每个文件,则可
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()
这将返回一个序列apd.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()