Python 如何有效地重新安排熊猫和NumPy每天通过/不通过的百分比?
我试图分析有这种形式的数据Python 如何有效地重新安排熊猫和NumPy每天通过/不通过的百分比?,python,numpy,pandas,Python,Numpy,Pandas,我试图分析有这种形式的数据 date | result | test ---------------------------- 10-08-13 | True | test_1 10-08-13 | True | test_2 10-08-13 | False | test_2 10-07-13 | True | test_3 10-07-13 | False | test_4 10-06-13 | True | test_3 10-05-13 | False |
date | result | test
----------------------------
10-08-13 | True | test_1
10-08-13 | True | test_2
10-08-13 | False | test_2
10-07-13 | True | test_3
10-07-13 | False | test_4
10-06-13 | True | test_3
10-05-13 | False | test_1
我想要创建的是每个测试的通过率随时间变化的时间序列。因此,理想情况下,我希望将数据重新整理成以下形式:
date | test_1 | test_2 | test_3 | test_4
-----------------------------------------------
10-08-13 | 50 | 70 | 55 | 100
10-08-13 | 60 | 70 | 55 | 100
10-08-13 | 30 | 70 | 55 | NaN
10-07-13 | 50 | 10 | NaN | 100
10-07-13 | 30 | 10 | NaN | 100
10-06-13 | 50 | 70 | Nan | 100
10-05-13 | 50 | 70 | 55 | 100
到目前为止,我已经能够使用以下代码重新排列数据:
all_tests = data.groupby('test').size()
data_grouped = data.groupby('date')
per_test_per_day = {}
def tests_per_day(group):
g = group.groupby('test')
tests = g.size()
tests_pass = g['result'].sum()
for d in all_tests.index:
if d not in per_test_per_day:
per_device_per_day[d] = []
if d in tests:
per_test_per_day[d].append(tests_pass[d] / tests[d] * 100)
else:
per_test_per_day[d].append(NaN)
data_grouped.apply(tests_per_day)
结果数据框看起来很接近我需要的,只是它的索引只是标准整数,所以我的X轴没有标记正确的日期
我相信有一种更好的方法可以使用Pandas和NumPy来完成数据转换。现在我想这是一种更好的方式: 注意:默认的aggfunc是mean,这正是您想要的
查看此答案的编辑历史记录,了解使用groupby、mean和unstack的不太直接的方式。现在我想这是一个更好的方式: 注意:默认的aggfunc是mean,这正是您想要的
查看此答案的编辑历史记录,了解使用groupby、mean和unstack的不太直接的方式。现在我想这是一个更好的方式: 注意:默认的aggfunc是mean,这正是您想要的
查看此答案的编辑历史记录,了解使用groupby、mean和unstack的不太直接的方式。现在我想这是一个更好的方式: 注意:默认的aggfunc是mean,这正是您想要的
查看此答案的编辑历史记录,了解使用groupby、mean和unstack的不太直接的方法。Perfect,效果很好。然而,我不清楚unstack操作到底做了什么。关于该函数的Pandas文档对我来说没有多大意义。@FraserGraham它基本上是一个轴心,将测试级别转换为一组列,这让我意识到你所做的只是一个轴心!啊哼!现在这更有意义了。多年前,我在Excel中使用pivot表时就了解了它们。在这种情况下,堆栈和取消堆栈操作对我来说更有意义。完美,就像一个符咒。然而,我不清楚unstack操作到底做了什么。关于该函数的Pandas文档对我来说没有多大意义。@FraserGraham它基本上是一个轴心,将测试级别转换为一组列,这让我意识到你所做的只是一个轴心!啊哼!现在这更有意义了。多年前,我在Excel中使用pivot表时就了解了它们。在这种情况下,堆栈和取消堆栈操作对我来说更有意义。完美,就像一个符咒。然而,我不清楚unstack操作到底做了什么。关于该函数的Pandas文档对我来说没有多大意义。@FraserGraham它基本上是一个轴心,将测试级别转换为一组列,这让我意识到你所做的只是一个轴心!啊哼!现在这更有意义了。多年前,我在Excel中使用pivot表时就了解了它们。在这种情况下,堆栈和取消堆栈操作对我来说更有意义。完美,就像一个符咒。然而,我不清楚unstack操作到底做了什么。关于该函数的Pandas文档对我来说没有多大意义。@FraserGraham它基本上是一个轴心,将测试级别转换为一组列,这让我意识到你所做的只是一个轴心!啊哼!现在这更有意义了。多年前,我在Excel中使用pivot表时就了解了它们。在这种情况下,堆栈和取消堆栈操作对我来说更有意义。
In [21]: df.pivot_table(values='result', cols='test', rows='date')
Out[21]:
test test_1 test_2 test_3 test_4
date
10-05-13 0 NaN NaN NaN
10-06-13 NaN NaN 1 NaN
10-07-13 NaN NaN 1 0
10-08-13 1 0.5 NaN NaN
In [22]: df.pivot_table(values='result', cols='test', rows='date') * 100
Out[22]:
test test_1 test_2 test_3 test_4
date
10-05-13 0 NaN NaN NaN
10-06-13 NaN NaN 100 NaN
10-07-13 NaN NaN 100 0
10-08-13 100 50 NaN NaN