2015-10-15 161 views
3

,我有以下數據:Python的數量和概率

Name Item 
peter apple 
peter apple 
Ben  banana 
peter banana 

我想打印

這是我的代碼

u, count = np.unique(data['Item'], return_counts=True) 

process = u[np.where(data['Name']= 'peter')[0]] 

process2 = dict(Counter(process)) 
print "Item\frequency" 

for k, v in process2.items(): 
print '{0:.0f}\t{1}'.format(k,v) 

,但它得到了錯誤 我也想計算下次吃蘋果的概率 但我沒有想法,任何建議?

+0

錯誤:關鍵字不能表達 – aaaabbbb

+0

什麼是'data'?熊貓DataFrame? Numpy記錄陣列?哪一行你得到的錯誤 –

+0

我用熊貓閱讀我的數據文件 – aaaabbbb

回答

2

你所得到的錯誤是因爲對方的回答表明,你不能使用data['Name'] = 'peter'作爲函數參數,你居然打算用 - np.where(data['Name'] == 'peter')

但是,鑑於您使用的是pandas,而且我猜測data是一個熊貓DataFrame。在這種情況下,您真正​​想要的可以使用DataFrame.groupby來實現。示例 -

data[data['Name']=='peter'].groupby('Item').count() 

演示 -

In [7]: data[data['Name']=='peter'].groupby('Item').count() 
Out[7]: 
     Name 
Item 
apple  2 
banana  1 

如果你想這樣的循環打印,你可以使用 -

df = data[data['Name']=='peter'].groupby('Item').count() 
for fruit,count in df['Name'].iteritems(): 
    print('{0}\t{1}'.format(fruit,count)) 

演示 -

In [24]: df = data[data['Name']=='peter'].groupby('Item').count() 

In [25]: for fruit,count in df['Name'].iteritems(): 
    ....:  print('{0}\t{1}'.format(fruit,count)) 
    ....: 
apple 2 
banana 1 

對於更新的問題是,OP漸漸,他在那裏發現了以下錯誤 -

TypeError: invalid type comparison

在這種情況下,因爲在OP真實的數據出現問題,列有數值( float/int),但是OP將這些值與字符串進行比較,從而得出錯誤。示例 -

In [30]: df 
Out[30]: 
    0 1 
0 1 2 

In [31]: df[0]=='asd' 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-31-e7bacd79d320> in <module>() 
----> 1 df[0]=='asd' 

C:\Anaconda3\lib\site-packages\pandas\core\ops.py in wrapper(self, other, axis) 
    612 
    613    # scalars 
--> 614    res = na_op(values, other) 
    615    if np.isscalar(res): 
    616     raise TypeError('Could not compare %s type with Series' 

C:\Anaconda3\lib\site-packages\pandas\core\ops.py in na_op(x, y) 
    566     result = getattr(x, name)(y) 
    567     if result is NotImplemented: 
--> 568      raise TypeError("invalid type comparison") 
    569    except (AttributeError): 
    570     result = op(x, y) 

TypeError: invalid type comparison 

如果您的列是數字,則應該與數字值進行比較,而不是字符串。

+0

感謝您的回答,但它有「無效類型比較」錯誤 – aaaabbbb

+0

什麼是給予?你的方法?如果是這樣,你爲什麼使用它?如果您使用熊貓,您應該使用「熊貓」方法和功能。就像我上面給的那樣。 –

+0

數據是用pd.read_csv來讀取我的文件 – aaaabbbb

0

我不是超級熟悉的熊貓或NumPy的,但有一個問題,我可以看到的是:

data['Name'] = 'peter' 

是一個賦值語句。

儘管你可能要檢查的平等:

data['Name'] == 'peter' 

而且,除非你的壓痕在這裏粘貼代碼搞砸了,你需要縮進的身體你的陳述,或者你會發現另一個錯誤一旦你清除了這一個。

for k, v in process2.items(): 
    print '{0:.0f}\t{1}'.format(k,v) 
+0

謝謝你的答案,我改變了,它得到了「無效類型比較」錯誤 – aaaabbbb

+0

什麼是數據類型[「Name」]?嘗試'print typeof(data [「Name」])。 –

+0

aaaabbbb

0

如果你不使用numpy的死心塌地:

import collections 
import csv 

data = collections.defaultdict(lambda: collections.defaultdict(int)) 
with open('path/to/file') as infile: 
    infile.readline() # fet rid of the header 
    for name, food in csv.reader(infile): 
     data[name][food] += 1 

for name, d in data.iteritems(): 
    print("frequency of what" name, "ate:") 
    total = float(sum(d.values())) 
    for food, count in d.iteritems(): 
     print(food, count, "probability:", count/total) 
+0

感謝您的回答,但我需要使用numpy。不管怎麼說,還是要謝謝你 :) – aaaabbbb

2

可以GROUPBY名稱,並使用value_counts

In [11]: df.groupby("Name")["Item"].value_counts() 
Out[11]: 
Name 
Ben banana 1 
peter apple  2 
     banana 1 
dtype: int64 

潛在的,你可以拆散到這些列:

In [12]: df.groupby("Name")["Item"].value_counts().unstack(1) 
Out[12]: 
     apple banana 
Name 
Ben  NaN  1 
peter  2  1 

In [13]: res = df.groupby("Name")["Item"].value_counts().unstack(1).fillna(0) 

In [13]: res 
Out[13]: 
     apple banana 
Name 
Ben  0  1 
peter  2  1 

爲了得到概率除以總和:

In [14]: res = res.div(res.sum(axis=1), axis=0) 

In [15]: res 
Out[15]: 
      apple banana 
Name 
Ben 0.000000 1.000000 
peter 0.666667 0.333333 

和彼得吃一個蘋果下一次的概率:

In [16]: res.loc["peter", "apple"] 
Out[16]: 0.66666666666666663