python - Pandas 使用计数和条件总结不同的数据类型

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

我猜这适用于数据透视表,但由于我使用的是数据框,所以一切都混淆了。

对于第五列,我希望合并每个地址的唯一值的数量。例如,在纽约,该值应为 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 步是将 Score 设为 float 列;最好在开始处理之前先确定类型。

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

然后我们将使用类似 groupby 的列创建一个新框架。我们可以通过传递 .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]

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

关于python - Pandas 使用计数和条件总结不同的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21666202/

相关文章:

Pandas 截断列名

MySQL 连接问题

python - Ubuntu Python 3 上的 Pygame

python - Web2py - 如何将用户名字段自动转换为大写

python - 执行复杂功能后创建新的 pandas 数据框

python:行连接 2 个数据帧,将它们的名称保留为新列

count - jasper 报告计算某些类别的出现次数

r - 如何构建一个双向表总结 R 中的第三个变量(kable 包)

c# - .net 框架与 scrapy python

python - 使用GitHub Decoder脚本解码有效载荷