`groupby` 和 `apply(list)` 分组并转换为列表。

58 阅读1分钟

示例数据框

import pandas as pd

price_df= pd.DataFrame({
    'itemId': ["A", "A", "A", "B", "B","B"," C"," C"," C"],
    'date':["date1","date2","date3","date4","date5","date6","date7","date8","date9"],
    'discountePrice': [1, 1, 1, 2, 3, 1, 4,5,5]
})
display(price_df)
list_df =price_df.groupby("itemId")["discountePrice"].apply(set).apply(list).reset_index()
display(list_df)
list_df.columns = ['itemId', 'list_']

def price_mark(row):
    list_ = row['list_']
    min_val=min(list_)
    max_val=max(list_)
    if len(list_)==1:
        price_=max_val
        status="1"
    else:
        price_=0
        status="0"
    row["price_"]=price_  
    row["status"]=status  
    return row

list_df = list_df.apply(price_mark, axis=1)
display(list_df)


解释:

  1. 创建示例数据框:初始化包含 itemIddiscountePrice 列的数据框。
  2. itemId 分组并将 discountePrice 转换为列表:使用 groupbyapply(list)discountePriceitemId 分组并转换为列表。
  3. 定义 price_mark 函数:计算每个 itemId 的最小值和最大值,并根据列表的长度设置 price_status
  4. 应用 price_mark 函数:使用 applyprice_mark 函数应用到 list_df 的每一行。
  5. 合并结果:将 price_status 列合并回原始数据框。

运行结果:

python
复制代码
  itemId  discountePrice       list_  price_ status
0      A               1     [1, 1, 1]       0      0
1      A               1     [1, 1, 1]       0      0
2      A               1     [1, 1, 1]       0      0
3      B               2     [2, 3, 1]       0      0
4      B               3     [2, 3, 1]       0      0
5      B               1     [2, 3, 1]       0      0
6      C               4  [4, 5, 5]       0      0
7      C               5  [4, 5, 5]       0      0
8      C               5  [4, 5, 5]       0      0

通过这种方式,你可以在 list_df 中存储计算结果,并将其合并回原始数据框。