pandas DataFrame:
构造函数:
iterables = [[date(2018,5,31),date(2018,6,26),date(2018,6,29),date(2018,7,1)],
['test1','test2']]
indx = pd.MultiIndex.from_product(iterables, names=['date','tests'])
col = ['tests_passing', 'tests_total']
data = np.array([[834,3476],[229,256],[1524,1738],[78,144],[1595,1738],[78,144],[1595,1738],[142,144]])
df = pd.DataFrame(data, index=indx, columns=col)
df = df.assign(tests_remaining= df['tests_total'] - df['tests_passing'])
数据框:
tests_passing tests_total tests_remaining
date tests
2018-05-31 test1 834 3476 2642
test2 229 256 27
2018-06-26 test1 1524 1738 214
test2 78 144 66
2018-06-29 test1 1595 1738 143
test2 78 144 66
2018-07-01 test1 1595 1738 143
test2 142 144 2
此数据包含一些在某个日期收集的测试测量值(test1,test2等)。
我想在此数据框中创建一个名为“ progress”的新列,该列通常会选择所有日期中test =唯一测试(例如,test1)的所有行,并在date0减去该行的“ tests_remaining”列值,并添加下一个date1,date2,...等行的值基本上是这样的:
df.loc[(date0,test0),'progress'] = df.loc[(date0,test0),'tests_remaining']-df.loc[(date1,test0),'tests_remaining]
(除了第一个日期是第一个收集的日期外,第一个日期的进度值为0)。
所需的输出将如下所示:
tests_passing tests_total tests_remaining progress
date tests
5/31/2018 test1 834 3476 2642 0
test2 229 256 27 0
6/26/2018 test1 1524 1738 214 2428
test2 78 144 66 -39
6/29/2018 test1 1595 1738 143 71
test2 78 144 66 0
7/1/2018 test1 1595 1738 143 0
test2 142 144 2 64
到目前为止,我已经能够使用带有切片的loc []一次选择一个测试并将其作为最终的熊猫系列进行此计算,但是如果没有指定测试,我通常无法在所有测试中进行此操作在拆分中明确命名。这对我来说不是一个合理的解决方案,因为在真实数据中有数百种测试。
All = slice(None)
df_slice = df.loc[(All,'test1'),'tests_remaining']
sub = df_slice.diff(periods=-1).shift(1).fillna(0);sub
date tests
2018-05-31 test1 0.0
2018-06-26 test1 2428.0
2018-06-29 test1 71.0
2018-07-01 test1 0.0
Name: tests_remaining, dtype: float64
是否还有其他熊猫惯用的方式来创建所需的列?
在此先感谢您的帮助!
答案 0 :(得分:0)
您可以groupby
进行水平测试并进行diff
df.groupby(level='tests').tests_remaining.diff().mul(-1)
Out[662]:
date tests
2018-05-31 test1 NaN
test2 NaN
2018-06-26 test1 2428.0
test2 -39.0
2018-06-29 test1 71.0
test2 -0.0
2018-07-01 test1 -0.0
test2 64.0
Name: tests_remaining, dtype: float64