Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数据框中为每个实体添加缺失天数的行_Python_Pandas_Dataframe_Missing Symbols - Fatal编程技术网

Python 在数据框中为每个实体添加缺失天数的行

Python 在数据框中为每个实体添加缺失天数的行,python,pandas,dataframe,missing-symbols,Python,Pandas,Dataframe,Missing Symbols,我有以下问题:我的数据帧看起来像这样: ID Date Value 1 2016-06-12 2 1 2016-06-13 2.5 1 2016-06-16 4 2 2016-06-12 3 2 2016-06-15 1.5 ID Date Value 1 2016-06-12 2 1 2016-06-13 2.5 1 2016-06-14 NaN 1 2016-06-15 NaN 1 2016-06-16 4 2 20

我有以下问题:我的数据帧看起来像这样:

ID Date        Value

1 2016-06-12   2
1 2016-06-13   2.5
1 2016-06-16   4
2 2016-06-12   3
2 2016-06-15   1.5

ID Date        Value

1 2016-06-12   2
1 2016-06-13   2.5
1 2016-06-14   NaN
1 2016-06-15   NaN
1 2016-06-16   4
2 2016-06-12   3
2 2016-06-13   NaN
2 2016-06-14   NaN
2 2016-06-15   1.5

正如你所见,我的数据中缺少了几天。所以我更想要这样的东西:

ID Date        Value

1 2016-06-12   2
1 2016-06-13   2.5
1 2016-06-16   4
2 2016-06-12   3
2 2016-06-15   1.5

ID Date        Value

1 2016-06-12   2
1 2016-06-13   2.5
1 2016-06-14   NaN
1 2016-06-15   NaN
1 2016-06-16   4
2 2016-06-12   3
2 2016-06-13   NaN
2 2016-06-14   NaN
2 2016-06-15   1.5

为了解决这个问题,我做了以下工作:

df_new = df.groupby('ID').apply(lambda x: x.set_index('Date').resample('1D').first())

此解决方案可行,但处理大型数据集大约需要半小时。因此,我想知道是否有更好的解决方案?

第一个想法是创建
ID
Date
值的所有可能组合,然后与left join合并:

from  itertools import product

df['Date'] = pd.to_datetime(df['Date'])

L = list(product(df['ID'].unique(), pd.date_range(df['Date'].min(), df['Date'].max())))

df = pd.DataFrame(L, columns=['ID','Date']).merge(df, how='left')
print (df)
   ID       Date  Value
0   1 2016-06-12    2.0
1   1 2016-06-13    2.5
2   1 2016-06-14    NaN
3   1 2016-06-15    NaN
4   1 2016-06-16    4.0
5   2 2016-06-12    3.0
6   2 2016-06-13    NaN
7   2 2016-06-14    NaN
8   2 2016-06-15    1.5
9   2 2016-06-16    NaN
或使用,但性能应更差,取决于数据:

df['Date'] = pd.to_datetime(df['Date'])

mux = pd.MultiIndex.from_product([df['ID'].unique(), 
                                  pd.date_range(df['Date'].min(), df['Date'].max())],
                                  names=['ID','Date'])

df = df.set_index(['ID','Date']).reindex(mux).reset_index()
print (df)
   ID       Date  Value
0   1 2016-06-12    2.0
1   1 2016-06-13    2.5
2   1 2016-06-14    NaN
3   1 2016-06-15    NaN
4   1 2016-06-16    4.0
5   2 2016-06-12    3.0
6   2 2016-06-13    NaN
7   2 2016-06-14    NaN
8   2 2016-06-15    1.5
9   2 2016-06-16    NaN

第一个想法是使用左连接创建
ID
Date
值的所有可能组合,然后合并为左连接:

from  itertools import product

df['Date'] = pd.to_datetime(df['Date'])

L = list(product(df['ID'].unique(), pd.date_range(df['Date'].min(), df['Date'].max())))

df = pd.DataFrame(L, columns=['ID','Date']).merge(df, how='left')
print (df)
   ID       Date  Value
0   1 2016-06-12    2.0
1   1 2016-06-13    2.5
2   1 2016-06-14    NaN
3   1 2016-06-15    NaN
4   1 2016-06-16    4.0
5   2 2016-06-12    3.0
6   2 2016-06-13    NaN
7   2 2016-06-14    NaN
8   2 2016-06-15    1.5
9   2 2016-06-16    NaN
或使用,但性能应更差,取决于数据:

df['Date'] = pd.to_datetime(df['Date'])

mux = pd.MultiIndex.from_product([df['ID'].unique(), 
                                  pd.date_range(df['Date'].min(), df['Date'].max())],
                                  names=['ID','Date'])

df = df.set_index(['ID','Date']).reindex(mux).reset_index()
print (df)
   ID       Date  Value
0   1 2016-06-12    2.0
1   1 2016-06-13    2.5
2   1 2016-06-14    NaN
3   1 2016-06-15    NaN
4   1 2016-06-16    4.0
5   2 2016-06-12    3.0
6   2 2016-06-13    NaN
7   2 2016-06-14    NaN
8   2 2016-06-15    1.5
9   2 2016-06-16    NaN

你能用你的真实数据测试我的两个解决方案吗?我真的很好奇第一个解决方案是否比第二个更快/更好。谢谢。你能用你的真实数据测试我的两个解决方案吗?我真的很好奇第一个解决方案是否比第二个更快/更好。谢谢。抱歉耽搁了这么久。您的第一个解决方案似乎不适用于我,因为创建的列表太大,导致我这边出现内存错误(7500天*15000家公司)。今晚将尝试第二个解决方案。抱歉,花了这么长时间。您的第一个解决方案似乎不适用于我,因为创建的列表太大,导致我这边出现内存错误(7500天*15000家公司)。今晚将尝试第二个解决方案。