【问题标题】:Looping over list of dataframes to dynamically create new columns循环遍历数据框列表以动态创建新列
【发布时间】:2021-03-31 17:23:25
【问题描述】:

我正在研究一个可以让我评估各种客户行为的数据集。为此,我将几个 excel 文件读入列表,然后将它们连接到单个数据帧中。不过,在此步骤之前,我想在每个列中创建几个新列,以根据年份和产品汇总收入,类似于以下内容:

输入数据

| |Year     |Customer |Product  |PO       |Revenue  |
| |:--------|:--------|:--------|:--------|:--------|
|0| 2019    | Cust 1  | DIGITAL |  P1     |  100    |
|1| 2020    | Cust 1  | DIGITAL |  P2     |  120    |
|2| 2019    | Cust 2  | STORE   |  P3     |  240    |
|3| 2019    | Cust 1  | DIGITAL |  P4     |  200    |
|4| 2019    | Cust 2  | DIGITAL |  P5     |  110    |
|5| 2020    | Cust 2  | STORE   |  P6     |  100    |
|6| 2020    | Cust 3  | DIGITAL |  P7     |  120    |
|7| 2020    | Cust 3  | STORE   |  P8     |  180    |

期望的输出

| |Year     |Customer |Product  |PO       |Revenue  |19 Total |20 Total |19 Dig   |20 Dig   |19 Store |20 Store 
| |:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------|:--------
|0| 2019    | Cust 1  | DIGITAL |  P1     |  100    |  100    |         |  100    |         |         |  
|1| 2020    | Cust 1  | DIGITAL |  P2     |  120    |         |  120    |         |  120    |         |         
|2| 2019    | Cust 2  | STORE   |  P3     |  240    |  240    |         |         |         |  240    |  
|3| 2019    | Cust 1  | DIGITAL |  P4     |  200    |  200    |         |  200    |         |         |  
|4| 2019    | Cust 2  | DIGITAL |  P5     |  110    |  110    |         |  110    |         |         |
|5| 2020    | Cust 2  | STORE   |  P6     |  100    |         |  100    |         |         |         |  100    
|6| 2020    | Cust 3  | DIGITAL |  P7     |  120    |         |  120    |         |  120    |         |  
|7| 2020    | Cust 3  | STORE   |  P8     |  180    |         |  180    |         |         |         |  180    |

所以基本上每年都会有其年度总额,以及产品类别下的收入金额。注意,现在需要保持列或行的顺序。

您能提供的任何帮助都会很棒 - 如果有任何不妥之处,请告诉我。

编辑 在处理几个选项时,我发现下面的代码有效,但如果有人能提供帮助,我相信有一种更简洁的方式来编写它?

df_2019 = df.loc[df['Year'] == 2019]
df_2020 = df.loc[df['Year'] == 2020]

df_list = [df_2019, df_2020]

for i in df_list:
  i[str(i['Year'].min())+' Total Rev'] = i['Revenue']
  i[str(i['Year'].min())+' Dig Rev'] = i.loc[i['Product'] == 'DIGITAL', 'Revenue']
  i[str(i['Year'].min())+' Store Rev'] = i.loc[i['Product'] == 'STORE', 'Revenue']

df_combined = pd.concat(df_list).sort_index()
             
df_combined

【问题讨论】:

    标签: python pandas list loops


    【解决方案1】:

    我们可以pivot_table 两次,然后使用列表理解来展平您的 MultiIndex,最后使用 pd.concat 创建您的最终数据框:

    piv1 = df.pivot_table(
        index=["PO"], 
        columns='Year', 
        values="Revenue"
    ).reset_index(drop=True).add_suffix(" Total")
    
    piv2 = df.pivot_table(
        index=["PO"], 
        columns=["Year", "Product"], 
        values="Revenue"
    ).reset_index(drop=True)
    piv2.columns = [f"{c1} {c2}" for c1, c2 in piv2.columns]
    
    df = pd.concat([df, piv1, piv2], axis=1)
    
       Year Customer  Product  PO  Revenue  2019 Total  2020 Total  2019 DIGITAL  \
    0  2019   Cust 1  DIGITAL  P1      100       100.0         NaN         100.0   
    1  2020   Cust 1  DIGITAL  P2      120         NaN       120.0           NaN   
    2  2019   Cust 2    STORE  P3      240       240.0         NaN           NaN   
    3  2019   Cust 1  DIGITAL  P4      200       200.0         NaN         200.0   
    4  2019   Cust 2  DIGITAL  P5      110       110.0         NaN         110.0   
    5  2020   Cust 2    STORE  P6      100         NaN       100.0           NaN   
    6  2020   Cust 3  DIGITAL  P7      120         NaN       120.0           NaN   
    7  2020   Cust 3    STORE  P8      180         NaN       180.0           NaN   
    
       2019 STORE  2020 DIGITAL  2020 STORE  
    0         NaN           NaN         NaN  
    1         NaN         120.0         NaN  
    2       240.0           NaN         NaN  
    3         NaN           NaN         NaN  
    4         NaN           NaN         NaN  
    5         NaN           NaN       100.0  
    6         NaN         120.0         NaN  
    7         NaN           NaN       180.0    
    

    【讨论】:

    • 感谢 Erfan,感谢您在此问题上回复我 - 我遇到的问题是我的主要数据集实际上是大约 70 列,虽然我不需要保留顺序,但我确实需要确保他们都包括在内
    猜你喜欢
    • 2011-12-03
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2021-03-06
    相关资源
    最近更新 更多