[英]A more efficient way of repeating pandas rows for each row in another data frame?
如果這是一個簡單的問題,我對python / pandas很陌生。 我目前有2個數據框,一個帶有日期范圍,另一個帶有產品SKU。 我想創建一個數據框,該數據框重復每個日期的所有SKU。
我目前正在通過使用iterrows()來執行此操作,但是對於大型數據集而言,效率非常低下。
提前致謝。
例:
dates_df:
Date
0 2016-01-01
1 2016-01-02
2 2016-01-03
sku_df:
SKU
0 001
1 002
2 003
result_df:
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
您可以使用itertools.product :
In [30]: from itertools import product
In [31]: pd.DataFrame(list(product(dates.Date, sku.SKU)), columns=['Date','SKU'])
Out[31]:
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
或使用熊貓的笛卡爾積:
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
源DF:
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
兩個DF的時序各為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.