pandas 从多个分隔值计算平均值

vxbzzdmp  于 2023-05-27  发布在  其他
关注(0)|答案(1)|浏览(162)

我有很多excel文件,都是用来做笔记本/一张纸的,但是模板是一样的。我试图从它们创建一个单一的dataframe。
许多单元格都有多个价格数值,我想提取这些数值并找到它们的平均值,不包括日历年(例如2019年)。
假设单元格中的文本为:59万美元是2019年的最低水平。USD 650 K是初始报价。但我从来不知道里面有多少个数值,可能是1,也可能是5。
我想要的是得到除年份之外的所有值的平均值。所以在这个例子中:(590+650)/2=620
这是我目前得到的:

s=df['Price'].str.findall('\d+')
df['Price1'] = s.apply(lambda x: '_'.join(i for i in x if int(i)<2000))

这给出以下输出:

590_650

然后得到一个平均值:

df['Price1'].str.split('_').apply(lambda x : (float(x[0])+float(x[1]))/2)

然而,问题是,我并不总是有2个值,它可以是1,它可以是5。所以我想一些通用的,可以随时应用。
任何帮助感激不尽。

3pvhb19x

3pvhb19x1#

不带辅助列且带有join的解决方案:

s=df['Price'].str.findall('\d+')
df['Price2'] = s.apply(lambda x: np.mean([float(i) for i in x if int(i)<2000]))

或者:

s=df['Price'].str.extractall('(\d+)')
df['Price2'] = s[0].astype(float).loc[lambda x: x < 2000].groupby(level=0).mean()

具有辅助列的解决方案:

s=df['Price'].str.findall('\d+')
df['Price1'] = s.apply(lambda x: '_'.join(i for i in x if int(i)<2000))
df['Price2'] = df['Price1'].str.split('_', expand=True).astype(float).mean(axis=1)

相关问题