2017-07-31 80 views
4

所以我目前有一個數據集,它有一個名爲'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://stackoverflow.com/questions/45316031/searching-csv-files-with-pandas-unique-ids-python) – Paul

回答

2

好的。從我的理解。我認爲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

0

你可以試試這個。

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

我得到這個錯誤,'標籤[logid]不在[index]' – Cameron

1

我想你需要創建一個大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