簡體   English   中英

如何在 Python 中相互“相乘”數據幀?

[英]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不能由此邏輯產生,但我們可以從numpypython 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具有廣播rowfill所有未定義值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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM