Python:按日期计算添加,删除,

时间:2016-10-05 17:02:02

标签: python pandas dataframe

我在数据框中有两列有日期和名称的列。我每天都要计算每天输入和删除的记录数。

import numpy as np
import pandas as pd
df1 = pd.DataFrame({'Name': ['A', 'B', 'C', 'D','E']})
df1['Date'] = '2016-01-01'
df2 = pd.DataFrame({'Name': ['C', 'D','E','F']})
df2['Date'] = '2016-01-02'
df3 = pd.DataFrame({'Name': ['B', 'C', 'D','E','F']})
df3['Date'] = '2016-01-03'
df4 = pd.DataFrame({'Name': ['A', 'D', 'E','H']})
df4['Date'] = '2016-01-04'
df=pd.concat([df1,df2,df3,df4])
df=df.reset_index(drop=True)
df

我想要一个输出,对于每个日期,按日期计算加法和减法的数量。例如,在2016-01-02,A和B消失,但F是新的,3保持不变。我希望输出看起来如下:

Date        add  del  same
2016-01-02   1     2    3

我试图做一个完整的外部联接,然后分别计算银行,但这太低效了!

有没有人对更有效的方法有任何想法?非常感谢你!

1 个答案:

答案 0 :(得分:1)

我有一次尝试,但我不能说它是否会像你的完整外连接一样快或稳定,但它适用于上面的例子。

从你离开的地方开始,

CaptureImage()

正如你所看到的,它不是美丽的pythonic代码。这取决于转移,这意味着Date必须按顺序排列。您可以使用df['Value'] = 1 df = df.set_index(['Date', 'Name']).unstack('Name').fillna(0) df = (df - df.shift(1)) df = pd.DataFrame({i: j.value_counts() for i, j in df.iterrows()}).T.fillna(0) df.columns = ['del', 'same', 'add'] print(df) del same add 2016-01-01 0.0 0.0 0.0 2016-01-02 2.0 4.0 1.0 2016-01-03 0.0 6.0 1.0 2016-01-04 3.0 2.0 2.0 作为实际日期时间来确保发生这种情况。

它还使用了dict理解,然后将其转换回DataFrame。最后,它依赖于del,same和按顺序添加列。你可以做一个实际的映射,而不是覆盖。

我很想知道这与速度方面的加入相比如何。请告诉我们,我们都可以学到一些东西!