繁体   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