为了账号安全,请及时绑定邮箱和手机立即绑定

在 Pandas 数据框列表列中查找最大值

在 Pandas 数据框列表列中查找最大值

阿晨1998 2024-01-24 16:15:48
我有一个数据框(df):df = pd.DataFrame({'A' : [54321, 'it is 54322', 'is it 54323 or 4?', np.NaN]})我可以找到其中的数字:df['B'] = df.A.replace(regex={'[^\w]':'','^\D+':'','\D+':' '}).str.split('\s')                   A           B0              54321         NaN1        it is 54322     [54322]2  is it 54323 or 4?  [54323, 4]3                NaN         NaN但是当我尝试找到每行的最大数字时:df['C'] = df['B'].apply(lambda x : max(x))我得到:TypeError: 'float' object is not iterable
查看完整描述

2 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

将 lambda 函数与 一起使用if-else,还添加了转换为整数以确保正确max:


f = lambda x : max(int(y) for y in x) if isinstance(x, list) else np.nan

df['C'] = df['B'].apply(f)

print (df)

                   A           B        C

0              54321         NaN      NaN

1        it is 54322     [54322]  54322.0

2  is it 54323 or 4?  [54323, 4]  54323.0

3                NaN         NaN      NaN

或者使用Series.str.extractallforMultiIndex与 Convert toint并使用max每个第一级:

df = pd.DataFrame({'A' : [54321, 'it is 54322', 'is it 54323 or 4?', np.NaN]})

df['C'] = df.A.astype(str).str.extractall('(\d+)').astype(int).max(level=0)

print (df)

                   A        C

0              54321  54321.0

1        it is 54322  54322.0

2  is it 54323 or 4?  54323.0

3                NaN      NaN


查看完整回答
反对 回复 2024-01-24
?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

另一个解决方案:


import re

df['B'] = df['A'].apply(lambda x: pd.Series(re.findall(r'\d+', str(x))).astype(float).max())

print(df)

印刷:


                   A        B

0              54321  54321.0

1        it is 54322  54322.0

2  is it 54323 or 4?  54323.0

3                NaN      NaN


查看完整回答
反对 回复 2024-01-24
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信