循环遍历数据框列表以动态创建新列

时间:2020-12-21 23:32:43

标签: python pandas list loops

我正在研究一个数据集,可以让我评估各种客户行为。为此,我将几个 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

1 个答案:

答案 0 :(得分:1)

我们可以 apiVersion: v1 kind: Service metadata: name: somename-service spec: selector: app: somename ports: - protocol: TCP port: 9000 targetPort: 9000 type: LoadBalancer 两次,然后用列表推导来展平您的 MultiIndex,最后使用 pivot_table 创建您的最终数据框:

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)