[英]How to "multiply" dataframes with each other in Python?
我在 Python/pandas 中有兩個數據框,如下所示:
df1 =
[[2001 年 1 月 1 日,2004 年 1 月 4 日,2007 年 12 月 12 日],
[2002 年 2 月 7 日,北美,北美],
[2012 年 4 月 8 日,2018 年 2 月 11 日,北美]]
df2 =
[[1, 3, 2],
[2, 不適用, 不適用],
[3, 1, 不適用]]
我想創建第三個 dataframe,如下所示:
df3 =
[[2001 年 1 月 1 日,2004 年 1 月 4 日,2004 年 1 月 4 日,2004 年 1 月 4 日,2007 年 12 月 12 日,2007 年 12 月 12 日],
[2002 年 2 月 7 日,2002 年 2 月 7 日,北美,北美,北美,北美],
[04/08/2012, 04/08/2012, 04/08/2012, 02/11/2018, NA, NA]]
換句話說,第二個 df 給出了我想將第一個 df 的相應值復制到第三個的次數。 由於沒有更好的詞,我在問題中稱其為“乘法”,盡管我意識到這可能是錯誤的。
有人知道有效地做到這一點的方法嗎? 我的方法是為每一行使用循環和列表,但我猜想在 Python 中應該有一種更有效的方法來做到這一點。 非常感謝您的幫助,再次抱歉在這里可能使用了錯誤的術語。
完全vectorized solution
不能由此邏輯產生,但我們可以從numpy
和python Inbuilt
list comprehension
的內置操作中獲益。
邏輯:
1.使用np.repeat
Array manipulation routines
,我們將使用它沿dataframe df1
行重復,其中np.repeat
function 的repeats
參數將是df2
ZA666CFDE63191C4BEB6 行
np.repeat(df1.iloc[i,:], df2_u.iloc[i,:].astype('i4'))
2.要注意的重要一點是, repeats
arguments 應該是int
類型,我們將使用astype('i4')
這是np.int32
數據類型來轉換df2
行而list comprehension
。
df2_u.iloc[i,:].astype('i4')
3.最后,如何重復np.nan
值形式np.nan
只需將df2
更新為df2_u
,其中NA
使用此操作填充為0
:
df2_u = df2.fillna(0)
通用解決方案,這里的邏輯工作就像我們傳遞nested-list
list of lists
unequal-size
DataFrame-Object
具有廣播row
並fill
所有未定義值np.nan
object。
代碼:
import pandas as pd
import numpy as np
df1 = pd.DataFrame([['01/01/2001', '01/04/2004', '12/12/2007'],
['02/07/2002', np.nan, np.nan],
['04/08/2012', '02/11/2018', np.nan]])
df2 = pd.DataFrame([[1, 3, 2], [2, np.nan, np.nan], [3, 1, np.nan]])
df1_sub = df1
df2_sub = df2.fillna(0)
df3 = pd.DataFrame([list(np.repeat(df1_sub.iloc[i,:], df2_sub.iloc[i,:].astype('i4')) )for i in range(df1_sub.shape[0])])
print(df3)
OUTPUT:
[['01/01/2001' '01/04/2004' '01/04/2004' '01/04/2004' '12/12/2007''12/12/2007']
['02/07/2002' '02/07/2002' nan nan nan nan]
['04/08/2012' '04/08/2012' '04/08/2012' '02/11/2018' nan nan]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.