繁体   English   中英

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

[英]Find the max of a list in a Pandas dataframe column

我正在将 RSS 提要中的数据读取到数据框中,并尝试将单词(幼儿、儿童、成人)转换为表示最小/最大年龄的整数。 我已经用数字字符串替换了单词:

df['audience_max'].head(10)

0          10
1       2,4,3
2       2,4,3
3        10,3
4         2,3
5           4
6         4,3
7         4,3
8     10,4,12
9    2,10,4,3
Name: audience_max, dtype: string

接下来,我在此列上运行 for 循环以查找每个列表中的最大值并在数据框中创建一个新列。 我使用 str.split 将字符串更改为列表:

maxlist=[]
for x in df['audience_max'].str.split(','):
    maxlist.append(max(x))
    
df['max_age']=maxlist

结果如下。 您可以看到第 3,8 和 9 行没有显示最大值:

0    10
1     4
2     4
3     3
4     3
5     4
6     4
7     4
8     4
9     4
Name: max_age, dtype: object

当我检查创建列表的 for 循环中的代码行时,它似乎正确创建了列表:

(df['audience_max'].str.split(',')).head(10)
0             [10]
1        [2, 4, 3]
2        [2, 4, 3]
3          [10, 3]
4           [2, 3]
5              [4]
6           [4, 3]
7           [4, 3]
8      [10, 4, 12]
9    [2, 10, 4, 3]
Name: audience_max, dtype: object

但是由于某种原因 max(x) 似乎并没有始终如一地返回最大值。 我应该使用不同的功能吗?

您还需要在split后将值从字符串转换为整数:

df['max_age'] = df['audience_max'].apply(lambda x: max(map(int, x.split(','))))
#alternative
#df['max_age'] = df['audience_max'].apply(lambda x: max(int(y) for y in x.split(',')))
print (df)
  audience_max  max_age
0           10       10
1        2,4,3        4
2        2,4,3        4
3         10,3       10
4          2,3        3
5            4        4
6          4,3        4
7          4,3        4
8      10,4,12       12
9     2,10,4,3       10

或者通过expand=TrueDataFrame的值转换为DataFrame ,转换为floats ,因为也是NaN ,获取最大值并最后转换为整数:

df['max_age'] = (df['audience_max'].str.split(',', expand=True)
                                  .astype(float)
                                  .max(axis=1)
                                  .astype(int))
print (df)
  audience_max  max_age
0           10       10
1        2,4,3        4
2        2,4,3        4
3         10,3       10
4          2,3        3
5            4        4
6          4,3        4
7          4,3        4
8      10,4,12       12
9     2,10,4,3       10

基于这个答案,我能够使用 Series.str.extractall 获得最大值,而无需使用 for 循环:

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

哪个返回了正确的最大年龄:

0     10
1      4
2      4
3     10
4      3
5      4
6      4
7      4
8     12
9     10

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM