按日期缩小熊猫数据库的大小

时间:2020-04-22 20:55:49

标签: python pandas

我有一个大型数据集,其中包含具有不同日期和数据的多个列。我想创建一个新数据库,以限制数百个不同列的日期范围。

toy = pd.DataFrame()
toy['Date1'] = ['4/12/2020','4/11/2020','4/10/2020']
toy['Data1'] = [1, 2, 3]

toy['Date2'] = ['4/13/2020', '4/11/2020', '4/09/2020']
toy['Data2'] = [4, 5, 6]

新的数据库,其中指定了“日期”列或从其中的一个玩具日期中获取了数据:

new = pd.DataFrame()
new['Date'] = ['4/11/2020', '04/09/2020', '3/31/2020']
new['Data1'] = [2, NaN, NaN]
new['Data2'] = [5, 6, NaN]

意识到这确实很简单,但是需要一些可以用于数百个列并且不想使用循环的东西。

1 个答案:

答案 0 :(得分:1)

我认为没有非循环方法可以执行此操作,但是,您可以尝试通过将所有日期都包含在索引中来统一初始数据帧的索引,这样至少可以减少交互次数。这可以通过一个过程来完成,首先,让我们添加一列:

toy['Date10'] = ['4/12/2020', '4/11/2020', '4/20/2020']
toy['Data10'] = [2, 8, 7]

toy.columns # ['Date1', 'Data1', 'Date2', 'Data2', 'Date10', 'Data10']

创建一个数据帧列表,其中每个元素都包含一对Date-Data,并将Date设置为索引,然后设置concat

import re

dfs_toy = [x.set_index(x.columns[0]).dropna()
   for i, x in toy.groupby(lambda x: re.split('([0-9]+)', x)[1], axis=1)]

toy_2 = pd.concat(dfs_toy, axis=1)

#           Data1  Data10  Data2
# 4/12/2020 1.0    2.0     NaN
# 4/11/2020 2.0    8.0     5.0
# 4/10/2020 3.0    NaN     NaN

最后,如果您创建一个具有不同索引的新数据框,只需分配所有列,如果存在匹配项,则将向该列分配其他的nan值:

new_df = pd.DataFrame(index=['4/12/2020', '4/10/2020', '4/25/2020'])
new_df[toy_2.columns] = toy_2
new_df.head()

#            Data1 Data10 Data2
# 4/12/2020  1.0   2.0    NaN
# 4/10/2020  3.0   NaN    NaN
# 4/25/2020  NaN   NaN    NaN