猿问

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

我有一个数据框(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           B

0              54321         NaN

1        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


阿晨1998
浏览 109回答 2
2回答

江户川乱折腾

将 lambda 函数与 一起使用if-else,还添加了转换为整数以确保正确max:f = lambda x : max(int(y) for y in x) if isinstance(x, list) else np.nandf['C'] = df['B'].apply(f)print (df)                   A           B        C0              54321         NaN      NaN1        it is 54322     [54322]  54322.02  is it 54323 or 4?  [54323, 4]  54323.03                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        C0              54321  54321.01        it is 54322  54322.02  is it 54323 or 4?  54323.03                NaN      NaN

天涯尽头无女友

另一个解决方案:import redf['B'] = df['A'].apply(lambda x: pd.Series(re.findall(r'\d+', str(x))).astype(float).max())print(df)印刷:                   A        B0              54321  54321.01        it is 54322  54322.02  is it 54323 or 4?  54323.03                NaN      NaN
随时随地看视频慕课网APP

相关分类

Python
我要回答