动态操作一系列 DataFrame

问题描述 投票:0回答:1

我正在尝试动态操作一系列 DataFrame。例如,我想将 DataFrame(‘recs_df’ – 如下)乘以另一个 DataFrame 的值(‘Cost’ – 如下):

  recs_df1:
         Prod      Ord1  Ord2  Ord3
    0    Toys       4      2    1
    1    Candy      3      1    5
    2    Décor      2      3    4
    
   recs_df2:
         Prod      Ord1  Ord2  Ord3
    0    Toys       1     0     6
    1    Candy      4     1     5
    2    Décor      2     3     4
    
   recs_df3:
         Prod      Ord1  Ord2  Ord3
    0    Toys       1     2     3
    1    Candy      0     1     0
    2    Décor      1     3     4
    
    cost_df:
         Prod    Price
    0    Toys    2.00
    1    Candy   1.00
    2    Décor   3.00


The desired outcome is 3 new DataFrames formed by the product of the Cost_df to each of the recs#_df, i.e.:

new_df1:
0    Toys        8.00       4.00     2.00    
1    Candy       3.00       1.00     5.00
2    Décor       6.00       9.00     12.00

new_df2:     
0    Toys       2.00      0.00       12.00
1    Candy      4.00      1.00        5.00
2    Décor      6.00      9.00       12.00


new_df3:
0    Toys       2.00       4.00        6.00
1    Candy      0.00       1.00        0.00
2    Décor      3.00       9.00       12.00

我尝试过设置 DataFrame 列表,以及直接循环它们,但我总是遇到错误 - 例如:

df_list = [recs_df1, recs_df2, recs_df3]
for df in df_list:
    new_df.append(cost_df*df_list)

new_dfs  = [ ]
for j in range(3):
   for i in range(0,len(recs_df[j].index)):
          new=append((cost_df*df_list[j])
   new_dfs=pd.DataFrame(new)

显然,我很困惑。我欢迎您的建议 – 谢谢。

python dataframe list range
1个回答
0
投票

如果你使用公共列作为索引,事情会变得简单一些:

recs_df1 = pd.DataFrame(
    {'Ord1':[4, 3, 2], 
     'Ord2': [2, 1, 3], 
     'Ord3': [1, 5, 4]},
    index=['Toys', 'Candy', 'Décor'])
recs_df2 = pd.DataFrame(
    {'Ord1':[1, 4, 2], 
     'Ord2': [0, 1, 3], 
     'Ord3': [6, 5, 4]},
    index=['Toys', 'Candy', 'Décor'])
recs_df3 = pd.DataFrame(
    {'Ord1':[1, 0, 1], 
     'Ord2': [2, 1, 3], 
     'Ord3': [3., 0, 4]},
    index=['Toys', 'Candy', 'Décor'])
costs_df = pd.DataFrame(
    {'Price': [2., 1., 3.]}, index=['Toys', 'Candy', 'Décor'])

dfs = [recs_df1, recs_df2, recs_df3]
new_dfs = []

for df in dfs:
    new_df = df.copy()
    for col in new_df:
        new_df[col] = new_df[col] * costs_df.Price
        new_dfs.append(new_df)

你也可以在 numpy 中进行乘法:

new_dfs = [
    pd.DataFrame(
        costs_df.to_numpy() * df.to_numpy(), 
        columns=df.columns,
        index=df.index) 
    for df in dfs]

...Pandas 中似乎应该有一个类似的方法,但我无法让它发挥作用。

© www.soinside.com 2019 - 2024. All rights reserved.