[英]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=True
将DataFrame
的值转换为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.