我在数据框中有两列有日期和名称的列。我每天都要计算每天输入和删除的记录数。
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
我试图做一个完整的外部联接,然后分别计算银行,但这太低效了!
有没有人对更有效的方法有任何想法?非常感谢你!
答案 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和按顺序添加列。你可以做一个实际的映射,而不是覆盖。
我很想知道这与速度方面的加入相比如何。请告诉我们,我们都可以学到一些东西!