2015-10-15 164 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