2014-02-09 59 views
1

我有一个大的数据集,所以我要创建低于类似条件下工作的不同的数据类型总结:熊猫使用计数和条件

比方说,我们正在使用这组数据:

import pandas as pd 

df=pd.DataFrame({'Location': [ 'NY', 'SF', 'NY', 'NY', 'SF', 'SF', 'TX', 'TX', 'TX', 'DC'], 
       'Class': ['H','L','H','L','L','H', 'H','L','L','M'], 
       'Address': ['12 Silver','10 Fak','12 Silver','1 North','10 Fak','2 Fake', '1 Red','1 Dog','2 Fake','1 White'], 
       'Score':['4','5','3','2','1','5','4','3','2','1',]}) 

所以我想这些行是唯一的值df.Location

第一列将是每个位置的数据条目数。我可以分别得到:

df[df['Location'] =='SF'].count()['Location'] 
df[df['Location'] =='NY'].count()['Location'] 
df[df['Location'] =='TX'].count()['Location'] 
df[df['Location'] =='DC'].count()['Location'] 

第二,第三和第四列我想在类(H,L,M)来总结不同类型。我知道我能做到这一点的:

#Second Col for NY 
print (df[(df.Location =='NY') & (df.Class=='H')].count()['Class']) 
#Third Col for NY 
print (df[(df.Location =='NY') & (df.Class=='L')].count()['Class']) 
#Fourth Col for NY 
print (df[(df.Location =='NY') & (df.Class=='M')].count()['Class']) 

我猜测这将与数据透视表的工作,但因为我使用的是数据帧都搞混了。

对于第五列,我想合并每个地址的唯一值的数量。例如,在纽约的值应该是2,因为有两个独特的价值观和'12银”

print (df[(df.Location =='NY')].Address) 
>>> 
0 12 Silver 
2 12 Silver 
3  1 North 
Name: Address, dtype: object 

的副本我想这可以通过groupby被母鹿。但是我在使用它时总是感到困惑。我还可以使用.drop_duplicates然后count得到一个数值

第六栏应该是,如果该值小于整数4.因此,对纽约的值应该是

print (df[(df.Location =='NY') & (df.Score.astype(float) < 4)].count()['Score']) 

那么,什么是好的方法来创建一个像这样的数据框,其中行是与上述列的唯一位置?

它应该是这个样子:

Pop H L M HH L4 
DC 1 0 0 1 1 1 
NY 3 2 1 0 2 2 
SF 3 1 2 0 2 1 
TX 3 1 2 0 3 2 

因为我知道或多或少如何让每个组件,我可以通过一个阵列使用for loop但是应该有这样做的更简单的方法。

+0

这相当多,你想完成。你能显示输出DataFrame应该是什么? – DSM

+0

@DSM确定等一下。 – ccsv

+0

@DSM好的我花了一些时间来逐行计算它 – ccsv

回答

2

虽然有足够的堆垛技巧,但您可以一次完成这一切,但我认为这不值得。你有一个pivot操作和一堆groupby操作。所以分开做 - 这很简单 - 然后结合结果。

步骤#1是使Score浮动列;最好在开始处理之前获取类型。

>>> df["Score"] = df["Score"].astype(float) 

然后我们将用groupby-like列创建一个新框架。我们可以通过传递.agg这样一个字典来完成这项工作,但是我们不得不重新命名字段,所以没有多少意义。

>>> gg = df.groupby("Location") 
>>> summ = pd.DataFrame({"Pop": gg.Location.count(), 
...      "HH": gg.Address.nunique(), 
...      "L4": gg.Score.apply(lambda x: (x < 4).sum())}) 
>>> summ 
      HH L4 Pop 
Location    
DC   1 1 1 
NY   2 2 3 
SF   2 1 3 
TX   3 2 3 

[4 rows x 3 columns] 

然后,我们可以透视:

>>> class_info = df.pivot_table(rows="Location", cols="Class", aggfunc='size', fill_value=0) 
>>> class_info 
Class  H L M 
Location   
DC  0 0 1 
NY  2 1 0 
SF  1 2 0 
TX  1 2 0 

[4 rows x 3 columns] 

,并结合:

>>> new_df = pd.concat([summ, class_info], axis=1) 
>>> new_df 
      HH L4 Pop H L M 
Location      
DC   1 1 1 0 0 1 
NY   2 2 3 2 1 0 
SF   2 1 3 1 2 0 
TX   3 2 3 1 2 0 

[4 rows x 6 columns] 

您可以重本,只要你喜欢。

+0

哇我一直在看'pivot_table'和'groupby'一段时间。你是如何学会使用它们的?我得到了一些关于熊猫的教程。你只是看完整的文档或有其他一些教程吗?再次感谢 – ccsv

+0

@ccsv:我有点沉浸其中。在控制台上播放,阅读文档,阅读人们的答案。 – DSM