首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用枢轴表求和寻找大熊猫中最大数量

用枢轴表求和寻找大熊猫中最大数量
EN

Stack Overflow用户
提问于 2020-07-24 05:24:25
回答 2查看 755关注 0票数 0

我有一个项目,想从更有经验的用户那里知道达到目标的最佳方法。请帮助一个新手)

需要的是:

  • 查找“米制吨”栏的总价值。
  • 查找列“class”中每个类的总价值(例如:“HRW”- number,“HRS”- number,等等)
  • 在“目的地”栏中查找每个目的地的总价值(如:“加拿大”-编号、“中国”-编号等)

我在做的是:

  1. 从更大的csv创建dataFrame并过滤所需的列,因此我的框架如下所示: 检验= pd.read_csv("CY2020.csv",usecols =“星期四”,“等级”,“谷物”,“目的地”,“米陀罗”,parse_dates =“星期四”)小麦=“谷物”.str.contains(“小麦”) current_week =检查“周四"2020-07-16”每周=检验小麦和current_week weekly.head(10) 输出
  2. 创建枢轴表并找出“公制吨”栏的总价值: piv =weekly.pivot_table(值=“米制吨”,索引=“目的地”,列= "Class",aggfunc = "sum",fill_value = 0) piv.sum().sum() 表格
  3. 查找每个类的总值并对它们进行排序: Piv.sum().sort_values(上升=假)
  4. 查找每个目标的总值并对它们进行排序: Piv.sum(1).sort_values(上升=假)

所以,我的问题是:

  1. 有没有办法用较少的代码使一切变得更快?
  2. 如何创建“总计”列,该列将包含每一行的值之和?
  3. 如何创建底部有“Total”的行,该行将包含每个列的值之和?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-25 15:32:57

下面是一种设置粮食加工管道的方法。首先,使用下载和计算逻辑创建一个函数。

代码语言:javascript
复制
def process_grain(data_file, current_week, grain):
    
    fields = ["Thursday", "Grade", "Class", "Grain", "Destination", "Metric Ton" ]
    results = dict()
    
    with open(data_file, 'rt') as handle:
        table = (pd.read_csv(handle, 
                             usecols = fields,
                             parse_dates = ["Thursday"])
                 .query('Thursday == @current_week and Grain == @grain')
                 .pivot_table(values = "Metric Ton", 
                              index = "Destination",
                              columns = "Class",                              
                              aggfunc = "sum",
                              fill_value = 0,
                              margins = True,
                              margins_name = "Total"
                             )
                )
    results['by_dest_class'] = table
    results['by_dest']       = table.sum(axis=0).iloc[:-1].sort_values(ascending=False)
    results['by_class']      = table.sum(axis=1).iloc[:-1].sort_values(ascending=False)
    results['metric_ton']    = table.at['Total', 'Total']
    
    return results

第二,设置参数并调用函数。该函数返回一个数据框架(枢轴表);两个系列(按类别和目的地分列)和一个标量(一周的总公吨)。

代码语言:javascript
复制
data_file = 'CY2020.csv'
current_week = '2020-07-16'
grain = 'WHEAT'

results = process_grain(data_file, current_week, grain)

最后,我们可以遍历结果字典,查看关键名称和值数据类型:

代码语言:javascript
复制
for k, v in results.items():
    print('{:16s} {}'.format(k, type(v)))

by_dest_class    <class 'pandas.core.frame.DataFrame'>
by_dest          <class 'pandas.core.series.Series'>
by_class         <class 'pandas.core.series.Series'>
metric_ton       <class 'numpy.int64'>
票数 0
EN

Stack Overflow用户

发布于 2020-07-24 05:53:24

您可以在margins ()命令中使用pivot_table和margins_name来获取行和列的总计。经修订的职能要求如下:

代码语言:javascript
复制
weekly.pivot_table(values = "Metric Ton", 
                   index = "Destination",
                   columns = "Class",
                   aggfunc = "sum",
                   fill_value = 0,
                   margins = True,
                   margins_name = "Total"
                   
)

你能张贴几行csv文件吗?可以稍微简化从read_csv()到pivot_table()的步骤。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63067337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档