python - 为列组合填充缺失日期

标签 python pandas

我有一个数据框 3 列一个日期,2 个对象列。我需要使用数据框的最大和最小日期来填充不同 col1 和 col 2 组合的缺失日期。日期列仅包含每个月的第一天。

我使用天真的方式完成了它,但原始数据以数千或记录花费了大量时间来遍历所有 COL1+COL2 组合、日期范围。原始数据框包含 15000 条记录和 30 列。我需要填写缺少的日期 + col1 + col2,然后将所有列都设为空值。如果我有 2019 年 1 月的 col1+col2 组合数据,但没有 2 月的数据,我实际上想插入 feb、col1、col2,其他记录为空。

从原始数据帧到填充后应该有相等的唯一组合 (COL1 + COL2)。前后相同数量的组合

请帮我优化一下。

df_1 = pd.DataFrame({'Date':['2018-01-01','2018-02-01','2018-03-01','2018-05-01','2018-05-01'],
          'COL1':['A','A','B','B','A'],
          'COL2':['1','2','1','2','1']})
df_1['Date'] = pd.to_datetime(df_1['Date'])



Initial Dataframe -->> 
         Date COL1 COL2
0 2018-01-01    A    1
1 2018-02-01    A    2
2 2018-03-01    B    1
3 2018-05-01    B    2
4 2018-05-01    A    1

--

print(df_1.dtypes)

print(df_1)

COLS_COMBO = [i for i in list(set(list(df_1[['COL1','COL2']].itertuples(name='',index=False))))]
months_range = [str(i.date()) for i in list(pd.date_range(start=min(df_1['Date']).date(), 
                   end=max(df_1['Date']).date(), freq='MS'))]

print(COLS_COMBO)

print(months_range)

for col in COLS_COMBO:
    col1,col2 = col[0], col[1]
    for month in months_range:
        d = df_1[(df_1['Date'] == month) & (df_1['COL1'] == col1) & (df_1['COL2'] == col2)]
        if len(d) == 0:
            dx = {'Date':month,'COL1':col1,'COL2':col2}
            df_1 = df_1.append(dx, ignore_index=True)

print(df_1)

输出

Data TYPES -->> 


Date    datetime64[ns]
COL1            object
COL2            object
dtype: object


Unique COmbinations of COL1 + COL2 -->> 
 [('A', '2'), ('B', '2'), ('B', '1'), ('A', '1')]

Months range using min, max in the dataframe -->> 
 ['2018-01-01', '2018-02-01', '2018-03-01', '2018-04-01', '2018-05-01']

我的最终输出是

FINAL Dataframe -->> 

          Date COL1 COL2
0  2018-01-01    A    1
1  2018-02-01    A    2
2  2018-03-01    B    1
3  2018-05-01    B    2
4  2018-05-01    A    1
5  2018-01-01    A    2
6  2018-02-01    A    2
7  2018-03-01    A    2
8  2018-04-01    A    2
9  2018-05-01    A    2
10 2018-01-01    B    2
11 2018-02-01    B    2
12 2018-03-01    B    2
13 2018-04-01    B    2
14 2018-05-01    B    2
15 2018-01-01    B    1
16 2018-02-01    B    1
17 2018-03-01    B    1
18 2018-04-01    B    1
19 2018-05-01    B    1
20 2018-01-01    A    1
21 2018-02-01    A    1
22 2018-03-01    A    1
23 2018-04-01    A    1
24 2018-05-01    A    1

附言:

COL1 就像父项 COL2 是子项。因此,原始组合不应有任何变化,并且 (date+col1+col2) 组合不应重复/更新(如果存在)。

最佳答案

您可以使用:

from  itertools import product

#get all unique combinations of columns
COLS_COMBO = df_1[['COL1','COL2']].drop_duplicates().values.tolist()
#remove times and create MS date range
dates = df_1['Date'].dt.floor('d')
months_range = pd.date_range(dates.min(), dates.max(), freq='MS')
print(COLS_COMBO)
print(months_range)

#create all combinations of values
df = pd.DataFrame([(c, a, b) for (a, b), c in product(COLS_COMBO, months_range)], 
                   columns=['Date','COL1','COL2'])
print (df)
         Date COL1 COL2
0  2018-01-01    A    1
1  2018-02-01    A    1
2  2018-03-01    A    1
3  2018-04-01    A    1
4  2018-05-01    A    1
5  2018-01-01    A    2
6  2018-02-01    A    2
7  2018-03-01    A    2
8  2018-04-01    A    2
9  2018-05-01    A    2
10 2018-01-01    B    1
11 2018-02-01    B    1
12 2018-03-01    B    1
13 2018-04-01    B    1
14 2018-05-01    B    1
15 2018-01-01    B    2
16 2018-02-01    B    2
17 2018-03-01    B    2
18 2018-04-01    B    2
19 2018-05-01    B    2

#add to original df_1 and remove duplicates
df_1 = pd.concat([df_1, df], ignore_index=True).drop_duplicates()
print (df_1)
         Date COL1 COL2
0  2018-01-01    A    1
1  2018-02-01    A    2
2  2018-03-01    B    1
3  2018-05-01    B    2
4  2018-05-01    A    1
6  2018-02-01    A    1
7  2018-03-01    A    1
8  2018-04-01    A    1
10 2018-01-01    A    2
12 2018-03-01    A    2
13 2018-04-01    A    2
14 2018-05-01    A    2
15 2018-01-01    B    1
16 2018-02-01    B    1
18 2018-04-01    B    1
19 2018-05-01    B    1
20 2018-01-01    B    2
21 2018-02-01    B    2
22 2018-03-01    B    2
23 2018-04-01    B    2

关于python - 为列组合填充缺失日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54931476/

相关文章:

python - 在python中,你如何规定每一个lists的liSTLength = 1?

python - 如何根据数据框的其他列创建新的 Pandas 列?

python - ValueWarning : No frequency information was provided, 因此将使用推断频率 MS

python - 将 "word strings"和 "number strings"的列表转换为 "number strings"仅转换为数字的列表

python - 在数据框中显示重复值 -> 键错误

Python:对于每次迭代,系统状态都会发生变化

python - 给定 Pandas 数据框中的二进制列,我如何将前面的 0 更改为 1?

python - 使用 matplotlib 在网格中显示值

python - Dataframe 大型 JSON(嵌套的嵌套)

python - Pandas:通过行索引和列名获取单元格值