按日期拆分数据框并计算每个日期的所有行的中位数

史蒂夫·达拉斯

我试图粗略估计工作人员在给定月份可能完成的工作量。

我有一个大致像这样的 csv(虽然它要大得多):

+--------+-------+---------------+
|  Date  | Name  | Units of Work |
+--------+-------+---------------+
| 1/1/17 | Bob   |           450 |
| 2/1/17 | Alice |           300 |
| 2/1/17 | Bob   |           450 |
| 2/1/17 | Larry |            50 |
| 3/1/17 | Alice |           400 |
| 3/1/17 | Bob   |            11 |
| 3/1/17 | Larry |           100 |
| 4/1/17 | Alice |          1000 |
| 4/1/17 | Bob   |           240 |
| 4/1/17 | Larry |            33 |
+--------+-------+---------------+

我想要:

  1. 计算每个“日期”的中位数“工作单位”
  2. 确定是否有任何“姓名”在该“日期”中的“工作单位”中位数低于 20%
  3. 如果“名称”低于中位数的 20%,则删除它
  4. 将“日期”的“姓名”计数乘以该“日期”的“工作单位”的中位数
  5. 输出一个新的 csv,每个 'Date' 只出现一次,在它自己的行上,并且该日期的中位数'Units of work' 乘以该'Date' 剩余的'Name'

我什至不能满足要求 1,更不用说 2 到 5。我为每个日期获取一个文件而不是带有中位数的列,我得到一个名为“NewColumn”的新列,其中填充了“中值”一词,如下所示:

# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('date_trunc').assign(NewColumn='median')
df.median(axis=None, skipna=None, level=None, numeric_only=None)
for i, g in df.groupby('date_trunc'):
    g.to_csv('{}.csv'.format(i), header=True, index_label=False, index=False)
    +---------+-------+---------------+-----------+
    |  Date   | Name  | Units of work | NewColumn |
    +---------+-------+---------------+-----------+
    | 12/1/16 | Alice |          6222 | median    |
    | 12/1/16 | Bob   |         14530 | median    |
    | 12/1/16 | Larry |         16887 | median    |
    +---------+-------+---------------+-----------+

我知道我在这里可能做错了很多,但我真的很感激一些指导。

我想最终得到的是一个带有以下内容的 csv:

+---------+--------+
|  Date   | Median |
+---------+--------+
| 12/1/16 |   1110 |
| 1/1/17  |   1400 |
| 2/1/17  |   1200 |
+---------+--------+
彼得·莱姆比格勒

我希望以下步骤能让您更接近所需的 CSV 输出。

首先,这是输入 DataFrame 的清晰再现,供其他希望复制粘贴到的人使用pd.read_clipboard()

     Date     Name     Units of Work
0   Jan-17    Bob               450.0
1   Feb-17    Alice             300.0
2   Feb-17    Bob               450.0
3   Feb-17    Larry              50.0
4   Mar-17    Alice             400.0
5   Mar-17    Bob                11.0
6   Mar-17    Larry             100.0
7   Apr-17    Alice            1000.0
8   Apr-17    Bob               240.0
9   Apr-17    Larry              33.0

0. 将日期转换为 python datetime(用于合理的排序顺序)

# Docs on Python datetime format strings: https://docs.python.org/2/library/datetime.html#strftime-and-strptime-behavior
df['Date'] = pd.to_datetime(df['Date'].apply(lambda x: x.strip()), format='%b-%y')

1. 对于每个日期,找出工作的中位数

meds = df.groupby('Date')[['Units of Work']].median()
meds
    Units of Work
Date    
2017-01-01  450.0
2017-02-01  300.0
2017-03-01  100.0
2017-04-01  240.0

2, 3. 删除工作单元小于该日期工作单元中位数的20% 的行

# Set an index on which to merge the medians
df2 = df.set_index('Date')
# Pandas is smart enough to merge the 4-row meds DataFrame onto the 10-row df2 DataFrame based on matching index values
df2['Median'] = meds 

# Build a boolean mask to pick out "hard workers" and "slackers"
mask = df2['Units of Work'] >= 0.2 * df2['Median']

# "Hard workers," where units of work >= 20% of that date's median
df2[mask]
               Name  Units of Work  Median
Date                                      
2017-01-01   Bob             450.0   450.0
2017-02-01   Alice           300.0   300.0
2017-02-01   Bob             450.0   300.0
2017-03-01   Alice           400.0   100.0
2017-03-01   Larry           100.0   100.0
2017-04-01   Alice          1000.0   240.0
2017-04-01   Bob             240.0   240.0

# Bonus: "slackers," where units of work < 20% of that date's median
df2[~mask]
               Name  Units of Work  Median
Date                                      
2017-02-01   Larry            50.0   300.0
2017-03-01   Bob              11.0   100.0
2017-04-01   Larry            33.0   240.0

4.对于每个日期,将“努力工作”的人数乘以工作单位的中位数

df2[mask].groupby('Date').size().mul(meds['Units of Work'])
2017-01-01    450.0
2017-02-01    600.0
2017-03-01    200.0
2017-04-01    480.0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

按中位数拆分数据帧

按日期拆分数据库

在R中按日期中位数估算数据

如何按所有列的中位数对数据框列进行排序

按日期中位数excel

如何计算所有行的中位数?

计算分组数据框中行的中位数

如何计算此数据框中不同种类的中位数,其中位数按种类标记并删除重复项

在 Shiny 中按日期范围计算平均值和中位数

R按列中的新行拆分数据框

如何在熊猫数据框中按日期计算字符串列表中所有元素的出现次数

在熊猫数据框中,如何计算每月内每个十分位数的中位数

SAS EG - 按日期拆分的单个数据集与包含所有日期的单个附加数据集

计算数据框中一行的中位数并保存到新变量

按空行拆分数据框

按内容拆分数据框列

计算基线日期变化的熊猫数据框行的日期差异

如何在Spark DataFrame中计算按行中位数

按新年拆分日期行

计算R中数据框中行和列的中位数

计算数据框中多列的中位数

如何在熊猫数据框中有效地存储分数列表和按日期分组

按日期,自定义聚合器对大熊猫进行排序:合并每个日期的所有数据

需要扩展库存日志(日志)熊猫数据框,以包括每个产品ID的所有日期

熊猫数据框:每个唯一ID的所有日期之间的差额

创建一个数据框,其中包含每个 sku 范围之间的所有日期

按行计算数据帧但按日期时间分组

删除所有未包含日期索引的多个熊猫数据框的所有行

R:确定每个日期间隔是否与数据框中的所有其他日期间隔重叠