使用熊猫在csv文件中计数唯一的ID(python)

问题描述:

所以我目前有一个数据集,它有一个名为'logid'的列,它由4位数字组成。我在我的csv文件中有大约200k行,我想统计每个独特的logid并输出它。使用熊猫在csv文件中计数唯一的ID(python)

Logid | #为每个唯一的ID #ofoccurences。所以它可能是1000 | 10表示在csv文件列'logid'中可以看到10次logid 1000。分隔符|没有必要,只是让你们更容易阅读。这是目前我的代码:

import pandas as pd 
import os, sys 
import glob 
count = 0 
path = "C:\\Users\\cam19\\Desktop\\New folder\\*.csv" 
for fname in glob.glob(path): 
    df = pd.read_csv(fname, dtype=None, names=['my_data'], low_memory=False) 
    counts = df['my_data'].value_counts() 
counts 

使用此我得到一个奇怪的输出,我不很明白:

4   16463 
10013   490 
pserverno  1 
Name: my_data, dtype: int64 

我知道我做错事的最后一行

counts = df ['my_data']。value_counts()

但我不太确定是什么。作为参考,我提取的值是从excel文件中的C行(所以我猜这是第3列?)在此先感谢!

+0

将提供您'csv'文件结构? –

+0

它由64列(所有str值)和200k行组成,由int值组成。我只想看看标题为“logid”的第三行,但是对于所有200k行。他们是所有整数的100%。不知道你还有什么意思。 – Cameron

+1

[使用熊猫搜索CSV文件(独特的ID) - Python](https://*.com/questions/45316031/searching-csv-files-with-pandas-unique-ids-python) – Paul

好的。从我的理解。我认为csv文件可能是这样的。

row1,row1,row1 
row2,row2,row2 
row3,row3,row3 
logid,header1,header2 
1000,a,b 
1001,c,d 
1000,e,f 
1001,g,h 

而且我所有csv文件的格式做这个喜欢

# skipping the first three row 
df = pd.read_csv("file_name.csv", skiprows=3) 
print(df['logid'].value_counts()) 

和输出这个样子的

1001 2 
1000 2 

希望这会有所帮助。

更新1

df = pd.read_csv(fname, dtype=None, names=['my_data'], low_memory=False) 
在此行

参数names = ['my_data']创建数据帧的一个新的标题。由于您的csv文件具有标题行,因此您可以跳过此参数。而作为主标题你想row3,所以你可以跳过前三行。最后一件事,你正在阅读给定路径中的所有csv文件。所以要注意所有的csv文件都是相同的格式。快乐的编码。

+0

csv文件与你描述的稍有不同;然而使用你给定代码的这一部分; print(df ['logid'] .value_counts()),我能够输出logid和它显示在csv文件列中的次数。谢谢!! – Cameron

+0

@jezrael - 我做了一些修改你的代码,并发布两个我的答案。好,让我删除它。 :( –

+0

好吧,然后plus1。似乎OP需要别的东西... – jezrael

你可以试试这个。

counts = df.loc['logid'].value_counts() 
+0

我得到这个错误,'标签[logid]不在[index]' – Cameron

我想你需要创建一个大DataFrame通过append所有dflist然后concat第一:

dfs = [] 
path = "C:\\Users\\cam19\\Desktop\\New folder\\*.csv" 
for fname in glob.glob(path): 
    df = pd.read_csv(fname, dtype=None, usecols=['logid'], low_memory=False) 
    dfs.append(df) 

df = pd.concat(dfs) 

然后使用value_counts - 输出Series。因此,对于2 column DataFrame需要rename_axisreset_index

counts = df['my_data'].value_counts().rename_axis('my_data').reset_index(name='count') 
counts 

或者groupby和聚集size

counts = df.groupby('my_data').size().reset_index(name='count') 
counts 
+0

这将工作;但是,我有6000 csv文件与200000行在每个文件中,并列他们不会是一个明智的主意。此外,我也需要为每个文件分开数据。下面看看我正在寻找的答案,如果你好奇:) – Cameron

+0

你认为'RAMunna'的解决方案?什么对它有帮助?我不明白。你能解释更多吗? – jezrael

+0

好的,并且可以通过'df = pd.read_csv(fname,dtype = None,usecols = ['logid'],low_memory = False')过滤列'logid'。我编辑我的答案。 – jezrael