根据列限制生成列

时间:2019-10-31 04:06:12

标签: python pandas numpy

我有一个包含2列的数据框:

F_Date     Count
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421
01/09/2019  1421

我想创建一个新的date_2列,这样对于1/5的计数值(在我们的示例中为1421 * 20),我们有F_date +1;对于2/5的计数值,我们有F_Date + 2,其他1/5的值是F_date + 3,最后1/5的值是F_Date +4。

在我们的示例中,输出为

1421/5 = 284.2(四舍五入到最接近的284)条目应具有F_Date + 1 1421/5 = 284 * 2 = 568个条目应具有F_Date + 2

1421/5 = 284个条目应具有F_Date + 3

1421/5 = 284 + 1(由于四舍五入后将保留1,因此F_Date + 4

预期的输出列

F_Date     Count    Date_2

任何人都可以提供帮助。

1 个答案:

答案 0 :(得分:1)

如果我对您的理解正确:

import pandas as pd
import numpy as np

old_df = pd.DataFrame({'F_Date': ["01/09/2019" for _ in range(1421)],
                   "Count": [1421 for _ in range(1421)]})

def split_dates(old):
    df = old.copy()
    df["Date_2"] = np.where((df.index//(df["Count"]//5)).astype(int)<4,
                            (df.index//(df["Count"]//5)).astype(int),
                            4)
    df["F_Date"] = pd.to_datetime(df["F_Date"],format="%M/%d/%Y")
    df["Date_2"] = df["F_Date"]+pd.to_timedelta(df["Date_2"], 'd')
    return df

new_df = split_dates(old_df)

print (new_df)
#
                  F_Date  Count              Date_2
0    2019-01-09 00:01:00   1421 2019-01-09 00:01:00
1    2019-01-09 00:01:00   1421 2019-01-09 00:01:00
2    2019-01-09 00:01:00   1421 2019-01-09 00:01:00
3    2019-01-09 00:01:00   1421 2019-01-09 00:01:00
4    2019-01-09 00:01:00   1421 2019-01-09 00:01:00
...                  ...    ...                 ...
1416 2019-01-09 00:01:00   1421 2019-01-13 00:01:00
1417 2019-01-09 00:01:00   1421 2019-01-13 00:01:00
1418 2019-01-09 00:01:00   1421 2019-01-13 00:01:00
1419 2019-01-09 00:01:00   1421 2019-01-13 00:01:00
1420 2019-01-09 00:01:00   1421 2019-01-13 00:01:00

[1421 rows x 3 columns]

print (new_df.groupby(["Date_2"]).count())
#
                     F_Date  Count
Date_2                            
2019-01-09 00:01:00     284    284
2019-01-10 00:01:00     284    284
2019-01-11 00:01:00     284    284
2019-01-12 00:01:00     284    284
2019-01-13 00:01:00     285    285