pandas 对多个CSV文件的给定列的非重复值进行计数

dy1byipe  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(79)

我想读取一些CSV文件。它们都有一个共同的特定列,比如'b'。对于每个文件,我想计数不同的b

示例

例如,假设我有10个文件,每个文件有5列(abcde)和许多行。
如何获得一个汇总表,显示每个文件有多少个b的不同值?

import numpy as np
import pandas as pd

n = 1000
columns = list('abcde')
np.random.seed(0)
for i in range(10):
    filename = f'file_{i:02d}.csv'
    pd.DataFrame(
        np.random.randint(0, 1000, (n, len(columns))),
        columns=columns,
    ).to_csv(filename, index=False)

字符串
我想得到一个Pandas DataFrame,

filename    count
file_00.csv 10
file_01.csv 3
...

deikduxw

deikduxw1#

from glob import glob

filenames = glob('file_??.csv')
df = pd.Series({
    filename: (~pd.read_csv(filename).duplicated(['b'])).sum()
    for filename in filenames
}).to_frame('count').rename_axis(index='filename')

>>> df
             count
filename          
file_01.csv    645
file_00.csv    613
file_02.csv    617
file_03.csv    626
file_04.csv    623
file_05.csv    644
file_06.csv    615
file_07.csv    628
file_08.csv    645
file_09.csv    636

字符串

**额外的好处:存储具有每个第一个不同b-**的行

如果列是兼容的,您还可以为每个文件存储具有不同b的第一行:

df = pd.concat([
    pd.read_csv(filename).drop_duplicates(['b'])
    for filename in filenames
], keys=filenames)

>>> df
                   a    b    c    d    e
file_01.csv 0    689  191  884  615  649
            1     24   68  794  820  107
            2    566  469  718  157  897
            3    206  256  527  417  672
            4    765  755  741  197  926
...              ...  ...  ...  ...  ...
file_09.csv 986  626  622  224  726  274
            988  329  900  577   26  221
            990   47  800  369  567   11
            998  602  198  165  217  682
            999  564  982  890  126  450

[6292 rows x 5 columns]

相关问题