2016-12-02 58 views
0

我有一个关于熊猫的一般性问题。我有一个名为d的DataFrame,其中有很多关于公园的信息。所有独特的公园名称都存储在名为parks的数组中。还有另一列有位置ID,我想遍历公园阵列并打印与该公园名称关联的唯一位置ID计数。存储分组数据与变量

d[d['Park']=='AKRO'] 
len(d['Location'].unique()) 

给我的24824.

x = d[d['Park']=='AKRO'] 
print(len(x['Location'].unique())) 

计数给我的1。为什么一个位置计数?我认为这些都是一样的,除了我将信息存储在变量中。

所以很自然,我试图循环不起作用。有没有人有任何提示?

counts=[] 
for p in parks: 
    x= d[d['Park']==p] 
    y= (len(x['Location'].unique())) 
    counts.append([p,y]) 

回答

1

当您第一次进行子集化时,您不会将d[d['Park'] == 'ARKO']分配给任何东西。所以你并没有真正改变数据。您只能查看该部分数据。

当您指定x = d[d['Park']=='AKRO']时,x现在只是您使用第一个命令查看的那个部分。这就是为什么你得到你观察到的差异。

您的for循环实际上只循环使用d的列。如果你想遍历行,你可以使用下面的代码。

for idx, row in d.iterrows(): 
    print(idx, row) 

但是,如果要使用for循环来计算位置数,则必须遍历每个公园。像下面这样。

for park in d['Park'].unique(): 
    print(park, d.loc[d['Park'] == park, 'Location'].size()) 

但是,您可以在不迭代的情况下完成目标。这种方法是优选的。

d.groupby('Park')['Location'].nunique() 
1

你可以尝试像,

d.groupby('Park')['Location'].nunique() 
1

小心熊猫的数据帧功能,其生成行内变化与否。例如,d[d['Park']=='AKRO']实际上不会更改DataFrame d。但是,x = d[d['Park']=='AKRO']d[d['Park']=='AKRO']的输出设置为x,因此x现在只有1个位置。

您是否已手动检查“AKRO”有多少个唯一的位置ID? for循环在额外括号外面正确的看起来是正确的y= len(x['Location'].unique())