Python 为另一个数据帧中的每一行重复行的更有效方法?

Python 为另一个数据帧中的每一行重复行的更有效方法?,python,pandas,dataframe,Python,Pandas,Dataframe,我对python/pandas很陌生,如果这是一个简单的问题,很抱歉。 我目前有两个数据帧,一个带有日期范围,另一个带有产品SKU。我想创建一个数据框,重复每个日期的所有SKU 我目前正在使用iterrows()来实现这一点,但对于大型数据集来说,这是非常低效的 提前谢谢 例如: 日期\u df: Date 0 2016-01-01 1 2016-01-02 2 2016-01-03 SKU 0 001 1 002 2 003 Date SKU 2016

我对python/pandas很陌生,如果这是一个简单的问题,很抱歉。 我目前有两个数据帧,一个带有日期范围,另一个带有产品SKU。我想创建一个数据框,重复每个日期的所有SKU

我目前正在使用iterrows()来实现这一点,但对于大型数据集来说,这是非常低效的

提前谢谢

例如:

日期\u df:

        Date
0 2016-01-01
1 2016-01-02
2 2016-01-03
  SKU
0 001
1 002
2 003
Date          SKU
2016-01-01    001
2016-01-01    002
2016-01-01    003
2016-01-02    001
2016-01-02    002
2016-01-02    003
2016-01-03    001
2016-01-03    002
2016-01-03    003
sku df:

        Date
0 2016-01-01
1 2016-01-02
2 2016-01-03
  SKU
0 001
1 002
2 003
Date          SKU
2016-01-01    001
2016-01-01    002
2016-01-01    003
2016-01-02    001
2016-01-02    002
2016-01-02    003
2016-01-03    001
2016-01-03    002
2016-01-03    003
结果\u df:

        Date
0 2016-01-01
1 2016-01-02
2 2016-01-03
  SKU
0 001
1 002
2 003
Date          SKU
2016-01-01    001
2016-01-01    002
2016-01-01    003
2016-01-02    001
2016-01-02    002
2016-01-02    003
2016-01-03    001
2016-01-03    002
2016-01-03    003
您可以使用:

或者使用熊猫的笛卡尔积:

In [136]: pd.merge(dates.assign(key='x'), sku.assign(key='x'), on='key').drop('key', 1)
Out[136]:
        Date  SKU
0 2016-01-01  001
1 2016-01-01  002
2 2016-01-01  003
3 2016-01-02  001
4 2016-01-02  002
5 2016-01-02  003
6 2016-01-03  001
7 2016-01-03  002
8 2016-01-03  003
来源DFs:

In [32]: dates
Out[32]:
        Date
0 2016-01-01
1 2016-01-02
2 2016-01-03

In [33]: sku
Out[33]:
   SKU
0  001
1  002
2  003
两个DFs各1K行的计时,因此生成的DF将有1M行:

In [153]: dates = pd.DataFrame({'Date':pd.date_range('2000-01-01', periods=1000)})
     ...: sku = pd.DataFrame({'SKU':np.arange(1, 1001).astype(str)})
     ...: sku.SKU = sku.SKU.str.zfill(3)
     ...:

In [154]: dates.shape
Out[154]: (1000, 1)

In [155]: sku.shape
Out[155]: (1000, 1)

In [156]: %timeit pd.DataFrame(list(product(dates.Date, sku.SKU)), columns=['Date','SKU'])
1 loop, best of 3: 667 ms per loop

In [157]: %timeit pd.merge(dates.assign(key='x'), sku.assign(key='x'), on='key').drop('key', 1)
1 loop, best of 3: 222 ms per loop

In [158]: len(pd.DataFrame(list(product(dates.Date, sku.SKU)), columns=['Date','SKU']))
Out[158]: 1000000

In [159]: len(pd.merge(dates.assign(key='x'), sku.assign(key='x'), on='key').drop('key', 1))
Out[159]: 1000000