进一步的问题:我如何获得模式(即最常见的条目)而不是最小值?换句话说,是否有一种简单的方法可以在df [' min_year'] = s.unstack(level = -1).min(axis = 1)中替换.min来获取最常见的,而不是最小的数字?
使用Python。我有一个包含三列的DataFrame:
Author | Title | Review
审核中的每个条目都包含多年(即' 88' 89W 87)。我想按每行最低年份排序。也就是说,我希望将' 87最低的所有行组合在一起。
如果我这样做
df.index = df['Review'].str.extractall(r'(\'\d\d)')
df = df.sort_index(ascending=False).reset_index(drop=True)
我明白了:
ValueError: Length mismatch: Expected axis has 1005046 elements, new values have 2449016 elements
即:我原来的DataFrame有1005046行,但是每行b / c大约有2。4年,最后我提取了2449016行。
问题似乎是函数extractall为模式的每个实例创建一个新行,所以最终我的行数比我开始时多2.449倍。
这是我打电话时的输出:
print(df['Review'].str.extractall(r'(\'\d\d)').head(10))
输出:
0
match
0 0 '69
1 '69
2 '69
1 0 '99
1 '99
2 0 '97
3 0 '86
1 '86
4 0 '96
6 0 '81
即:原始df中的零行有三个' 69的实例,在使用extractall后会创建三个单独的行。我需要按最小的一年对每个原始行进行排序,并保留关于df的所有其他内容。
答案 0 :(得分:1)
将extractall
的结果转换为系列:
s = df['Review'].str.extractall(r'(\'\d\d)').squeeze()
使用str
访问器将值转换为int:
s = s.str.replace("'", "").astype(int)
取消堆栈以将提取的值放回到行中(使用原始索引):
s.unstack(level=-1)
最后,我不会把最低年份放在索引中,而是放在一列:
df['min_year'] = s.unstack(level=-1).min(axis=1)
df = df.sort_values(by='min_year').drop(['min_year'], axis=1)