按行

时间:2017-10-11 17:34:46

标签: python regex pandas sorting

进一步的问题:我如何获得模式(即最常见的条目)而不是最小值?换句话说,是否有一种简单的方法可以在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的所有其他内容。

1 个答案:

答案 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)