Pandas使用计数和条件汇总不同的数据类型

时间:2014-02-09 22:51:24

标签: python pandas summary

我正在使用大型数据集,因此我将在下面创建类似的条件:

让我们说我们正在使用这个数据集:

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'])

我猜这可以使用数据透视表,但由于我使用的是数据帧,所以所有内容都混淆了。

对于第五列,我希望合并每个地址的唯一值数。例如,在NY中,值应为2,因为有两个唯一值和'12 Silver'的副本

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

我想这可以是groupby。但是在使用它时我总是感到困惑。我也可以使用.drop_duplicates然后count来获取数值

如果值小于整数4,则第六列应为。因此NY的值应为

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但是应该有更简单的方法来执行此操作。

1 个答案:

答案 0 :(得分:2)

虽然有足够的堆叠技巧,你可以一次性完成这一切,但我认为这不值得。你有一个数据透视操作和一堆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]

您可以根据需要重新排序。