我正试图根据某些条件转换我的数据帧。下面是我的输入数据帧
In [11]: df
Out[11]:
DocumentNumber I_Date N_Date P_Date Amount
0 1234 2016-01-01 2017-01-01 2017-10-23 38.38
1 2345 2016-01-02 2017-01-02 2018-03-26 41.00
2 1324 2016-01-12 2017-01-03 2018-03-26 30.37
3 5421 2016-01-13 2017-01-02 2018-03-06 269.00
4 5532 2016-01-15 2017-01-04 2018-06-30 271.00
for-loop
获得我想要的结果,但我知道这不是理想的方法,而且随着数据的增加,速度会变慢。因为我是python新手,所以我需要帮助通过列表理解或任何其他更快的选项来摆脱循环。你知道吗d1 = datetime.date(2017, 1, 1)
d2 = datetime.date(2017, 1, 15)
mydates = pd.date_range(d1, d2).tolist()
Delta = pd.Series(range(0,5)).tolist()
df_A =[]
for i in mydates:
for j in Delta:
A = df[(df["I_Date"]<i) & (df["N_Date"]>i+j) & (df["P_Date"]>i) ]
A["DateCutoff"] = i
A["Delta"]=j
A = A.groupby(['DateCutoff','Delta'],as_index=False).agg({'Amount':'sum','DocumentNumber':'count'})
A.columns = ['DateCutoff','Delta','A_PaymentAmount','A_DocumentNumber']
df_A.append(A)
df_A = pd.concat(df_A, sort = False)
In [14]: df_A
Out[14]:
DateCutoff Delta A_PaymentAmount A_DocumentNumber
0 2017-01-01 0 611.37 4
0 2017-01-01 1 301.37 2
0 2017-01-01 2 271.00 1
0 2017-01-02 0 301.37 2
0 2017-01-02 1 271.00 1
0 2017-01-03 0 271.00 1
mydates
和Delta
的内容创建单独的数据帧。.groupby
,然后.agg
支付的sum
和文档编号的count
。你知道吗pd.concat
将完整列表放入数据帧中。你知道吗condition.any()
返回True
,只要至少有一个元素是True
datetime
+int
已弃用,因此将其更改为datetime
+timedelta(days=x)
pd.Series(range(0,5)).tolist()
列一张单子太过分了。现在需要timedelta
对象,所以使用[timedelta(days=x) for x in range(5)]
mydates
和Delta
上的itertools.product
,而不是使用两个for-loops
进行迭代。这将创建一个(Timestamp('2017-01-01 00:00:00', freq='D'), datetime.timedelta(0))
形式的元组生成器A
时使用.copy()
,以防止SettingWithCopyWarning
list comprehension
。它们只是一种pythonic
的方法,但并不一定能提高性能。你知道吗for-loops
。for-loop
只根据条件创建数据帧。你知道吗更新代码:
输出
相关问题 更多 >
编程相关推荐