【问题标题】:Pandas, multiply part of one DF against another based on conditionPandas,根据条件将一个 DF 的一部分与另一个相乘
【发布时间】:2020-01-11 01:05:58
【问题描述】:

对此很陌生,并且无法找到正确的方法。

假设我的 dataframe1 看起来像这样,列名和一堆数字作为数据:

 D  L  W  S

 1  2  3  4

 4  3  2  1

 1  2  3  4

我的 dataframe2 看起来像这样:

Name1  Name2  Name3  Name4

2     data    data    D

3     data    data    S

4     data    data    L

5     data    data    S

6     data    data    W

我想要一个新的数据帧,其结果是将第二个数据帧的每一行与第一个数据帧的每一行相乘,其中它将 Name1 的值与与 Name4 值匹配的 dataframe1 列中的值相乘数据框2。

有什么好办法吗?我试图研究使用 whereconditionapply 等方法,但对事情的理解还不够好,无法让事情发挥作用。

编辑:使用以下代码为 DataFrames 创建假数据:

d1 = {'D':[1,2,3,4,5,6],'W':[2,2,2,2,2,2],'L':[6,5,4,3,2,1],'S':[1,2,3,4,5,6]}

d2 = {'col1': [3,2,7,4,5,6], 'col2':[2,2,2,2,3,4], 'col3':['data', 'data', 'data','data', 'data', 'data' ], 'col4':['D','L','D','W','S','S']}

df1 = pd.DataFrame(data = d1)

df2 = pd.DataFrame(data = d2)

再次编辑以获取更多信息

首先我在此时更改了 df1 中的数据,因此这个新示例会变得更好。 好的,所以从这两个数据帧中,如果乘法通过 df2 的前四行,我想创建的数据帧会像这样出现。可以看到 Col2 和 Col3 没有变化,但是根据 Col4 的字母,Col1 与 df1 中的对应因子相乘:

d3 = { 'col1':[3,6,9,12,15,18,12,10,8,6,4,2,7,14,21,28,35,42,8,8 ,8,8,8,8], 'col2':[2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2 ,2,2,2,2,2,2], 'col3':['data','data','data','data','data','data','data','data' ,'数据','数据','数据','数据','数据','数据','数据','数据','数据','数据','数据','数据','数据','数据','数据','数据'],'col4':['D','D','D','D','D','D','L',' L','L','L','L','L','D','D','D','D','D','D','W','W' ,'W','W','W','W']}

df3 = pd.DataFrame(data = d3)

【问题讨论】:

  • 请提供可以复制到 python 控制台的数据帧版本。
  • 是的先生,我添加了一个编辑信息,可以使数据帧像我描述的那样。
  • 谢谢,这让事情变得容易多了!但我不确定我是否理解你的描述。您还可以添加您想要创建的数据框吗?
  • 您好,我已经为目标数据框添加了一个示例。我想说我真的很感谢你看我的问题,因为我真的很难过。

标签: pandas dataframe conditional-statements


【解决方案1】:

我想我理解你想要达到的目标。您想将df2 中的每一行rdf1 中的相应列c 相乘,但c 中的元素仅与r 中的第一个元素相乘,其余行没有改变。

我在想可能有办法加入df1.transpose()df2,但我没有找到。 虽然不漂亮,但我认为下面的代码可以解决您的问题:

def stretch(row): 
    repeated_rows = pd.concat([row]*len(df1), axis=1, ignore_index=True).transpose() 
    factor = row['col1'] 
    label  = row['col4'] 
    first_column = df1[label] * factor 
    repeated_rows['col1'] = first_column 
    return repeated_rows                                                                                                                                  


pd.concat((stretch(r) for _, r in df2.iterrows()), ignore_index=True)                                                                                                        
#resulting in

   col1 col2  col3 col4
0     3    2  data    D
1     6    2  data    D
2     9    2  data    D
3    12    2  data    D
4    15    2  data    D
5    18    2  data    D
0    12    2  data    L
1    10    2  data    L
2     8    2  data    L
3     6    2  data    L
4     4    2  data    L
5     2    2  data    L
0     7    2  data    D
1    14    2  data    D
2    21    2  data    D
3    28    2  data    D
4    35    2  data    D
5    42    2  data    D
0     8    2  data    W
1     8    2  data    W
2     8    2  data    W
3     8    2  data    W
4     8    2  data    W
5     8    2  data    W
...

【讨论】:

  • 非常感谢同行!这很有帮助。我知道我可以用 Lists 做到这一点,但我现在想学习 Pandas 并且想不出该怎么做。这让我现在对如何使用 Pandas 做这些事情有了一个好主意。
猜你喜欢
  • 1970-01-01
  • 2017-04-22
  • 2020-09-16
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多