pandas 一个基于另一列值查找最小值并合并到1个 Dataframe 的循环?

fd3cxomn  于 2022-11-20  发布在  其他
关注(0)|答案(3)|浏览(148)

想象一个 Dataframe 如下:

import pandas as pd
list ={'Security ID':['3e09ax', 'we9lkl', 'as42we','as5322', 'ot24tas', 'c34ci46a8'],
          'Industry':['Airplanes', 'Airplanes', 'Oil', 'Oil', 'Housing', 'Trucking'],
          'Amount outstanding':[33, 31, 39, 21, 29, 29]}
df = pd.DataFrame(list)

'''

最终目标是将每个行业的最低(最小)未付金额的行返回到每日报告的“最小值”数据框中

基本上是这样,但是对于每个行业:

df[df['Amount outstanding'] == df['Amount outstanding'].min()]

第一步是再次将[Industry]的Unique Values放入列表中,然后生成一个循环函数来执行此操作。
不知道具体如何操作。这个数据框实际上是100,000行,包含30个每天都在变化的行业。

wfauudbj

wfauudbj1#

IIUC,您需要groupbytransform

output = df[df['Amount outstanding']==df.groupby('Industry')['Amount outstanding'].transform(min)]

>>> output

  Security ID   Industry  Amount outstanding
1      we9lkl  Airplanes                  31
3      as5322        Oil                  21
4     ot24tas    Housing                  29
5   c34ci46a8   Trucking                  29
c0vxltue

c0vxltue2#

df['B']=df['Amount outstanding'] 
df.groupby('Industry', group_keys=False).apply(lambda x: x.loc[x.B.idxmin()])

这将为您提供一个新的 Dataframe ,该 Dataframe 在“未付金额”列中只有最小值。如果需要,您可以立即删除“B”列

fkaflof6

fkaflof63#

简洁而有表现力; transformapply可能不适当地慢,特别是对于大 Dataframe 。

df.loc[df.groupby('Industry')['Amount outstanding'].idxmin()]

分成几部分的:

df.groupby('Industry')                                # for each industry
                             ['Amount outstanding'].idxmin() # get index of minimum 'Amount outstanding' 
df.loc[                                                     ]# return those rows of the original dataframe

***请注意:***确保'Amount outstanding'列的dtype是一个数字;如果它是object,它将比所需的慢几个数量级。我遇到过类似的情况,在1.9M行,30列的 Dataframe 上处理resample;在将列从object转换为float后,运行了几分钟而未完成的代码在几秒钟内完成。

相关问题