[英]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.