Python 数据框使用具有多个 lambda 的应用函数

Python dataframe use apply function with multiple lambda

我有一个简短的脚本。我使用那个脚本,例如我有数据集 我尝试先按 id 分组 3 然后我尝试再次对它们进行分组,但这次我尝试合并 name、url 和 house 示例输出和输入 数据集

输入 csv

id,name,house 
1,a,house1,
1,aa,house2
1,aaa,house3
2,b,house4
2,bb,house5
2,bbb,house6
3,c,house7
3,cc,house8
3,ccc,house9
4,d,house10
4,dd,house11
4,ddd,house12
4,dddd, house13

输出 csv

1,a,house1,aa,house2,aaa,houes3
2,b,house4,bb,house5,bbb,houes6
3,c,house7,cc,house8,ccc,houes9
4,d,house10,dd,house11,ddd,house12

脚本

    df = pd.read_csv('test.csv', delim_whitespace=True)
    df.sort_values(by=['id'])
    df = df.groupby('id').head(3).groupby('id').agg({
        'name': lambda l: ','.join(l),
        'house': lambda l: ','.join(l)
    })
    df[['name_first', 'name_second', 'name_third']] = df.name.str.split(',', expand=True)
    df[['house_first', 'house_second', 'house_third']] = df.house.str.split(',', expand=True)

    df = df.reset_index().drop(['name', 'house'], axis=1)
    df.to_csv('output.csv')

我想加progressbar,但是我加不上,如果我能把agg func 切换成apply func,我想我可以切换它progress_apply但是我不能改变怎么能我这样做,我需要进度条,因为我有超过 1000 万行的巨大 csv 文件,所以这需要时间,我想跟踪进程

df = pd.DataFrame({'id': ['1', '1', '1', '2', '2', '2', '3', '3', '3', '4', '4', '4', '4'],
 'name': ['a',  'aa',  'aaa',  'b',  'bb',  'bbb',  'c',  'cc',  'ccc',  'd',  'dd',  'ddd',  'dddd'], 
 'house': ['house1',  'house2',  'house3',  'house4',  'house5', 'house6',  'house7',  'house8',  'house9',  'house10',  'house11',  'house12',  ' house13']
})

这种方法创建了一个支点table

outcome = df.groupby('id').head(3)\
    .assign(count=df.groupby('id').cumcount())\
    .set_index(['id', 'count']).unstack()\
    .sort_index(axis=1, level=1)

然后我们可以在重命名列后保存它

outcome.columns = [f'{x}_{str(y)}' for x, y in outcome.columns]
outcome.to_csv('...')

但是这个没有进度条,因为我没有使用apply

为了使用而使用进度条:

from tqdm.notebook import tqdm
tqdm.pandas()

outcome = df.groupby('id').progress_apply(
    lambda x: x.head(3).reset_index(drop=True).set_index('id', append=True).unstack(0),
).droplevel(0).sort_index(axis=1, level=1)

outcome.columns = [f'{x}_{str(y)}' for x, y in outcome.columns]
outcome.to_csv('...')

请尝试这两种方法,看看哪个更快。