按方法分组(在 pandas 中)未按预期工作
Group by method (in pandas) not working as expected
我正在尝试处理 Stack Exchange data (specifically, stats.stackexchange.com 个问题)。
我试图找出这些年来问题的前三个标签;然后构造一个堆叠条形图。
我在下面使用的示例数据集不是实际数据集,但是类似于原始的 stack exchange 数据。
初始数据框如下所示:-
经过一些争论(下面的代码):-
import re
def my_function(x):
output = []
for s in re.findall("(?<=\<)(.*?)(?=\>)", x):
output.append(s)
output2 = ", ".join(output)
return output2
df3['Tags'] = [my_function(x) for x in df3['Tags']]
df3_new = df3.assign(Tags=df3['Tags'].str.split(',')).explode('Tags')
新数据框看起来像这样:-
注意到索引是如何重复的了吗?所以,我决定重新设置索引。
df3_new.reset_index(drop=True)
现在数据框看起来像这样:-
最后,我使用 group by 因为我希望获得某个标签在任何给定年份重复了多少次。然后我可以(稍后)过滤前三名。
df3_groupby = df3_new.groupby(['Tags']).size().reset_index(name='Count')
df3_groupby
注意上面的response和thankful是怎么重复的?让我们再试一组。
df3_groupby2 = df3_new.groupby(['Year', 'Tags'])['Year'].size().reset_index(name='Count')
df3_groupby2
value_counts呢?
我也尝试了一些其他的东西,比如删除 Body 列,为标签制作 set,但是,似乎什么都没有要工作了。
如果您能帮助我解决上述问题...或者是否有更好的方法来了解哪些问题标签在任何给定年份出现频率最高,我将不胜感激?
问题出在 space - 在 join
和 str.split
中需要 ,
有或没有 space:
import re
def my_function(x):
output = []
for s in re.findall("(?<=\<)(.*?)(?=\>)", x):
output.append(s)
#removed space
output2 = ",".join(output)
return output2
df3['Tags'] = [my_function(x) for x in df3['Tags']]
#here is , without space
df3_new = df3.assign(Tags=df3['Tags'].str.split(',')).explode('Tags')
import re
def my_function(x):
output = []
for s in re.findall("(?<=\<)(.*?)(?=\>)", x):
output.append(s)
#here is space after ,
output2 = ", ".join(output)
return output2
df3['Tags'] = [my_function(x) for x in df3['Tags']]
#added space to split
df3_new = df3.assign(Tags=df3['Tags'].str.split(', ')).explode('Tags')
但是更简单的是使用 Series.str.findall
来拆分列表,然后就不需要合并和拆分了:
df3_new = df3.assign(Tags=df3['Tags'].str.findall(r"(?<=\<)(.*?)(?=\>)")).explode('Tags')
我正在尝试处理 Stack Exchange data (specifically, stats.stackexchange.com 个问题)。
我试图找出这些年来问题的前三个标签;然后构造一个堆叠条形图。
我在下面使用的示例数据集不是实际数据集,但是类似于原始的 stack exchange 数据。
初始数据框如下所示:-
经过一些争论(下面的代码):-
import re
def my_function(x):
output = []
for s in re.findall("(?<=\<)(.*?)(?=\>)", x):
output.append(s)
output2 = ", ".join(output)
return output2
df3['Tags'] = [my_function(x) for x in df3['Tags']]
df3_new = df3.assign(Tags=df3['Tags'].str.split(',')).explode('Tags')
新数据框看起来像这样:-
注意到索引是如何重复的了吗?所以,我决定重新设置索引。
df3_new.reset_index(drop=True)
现在数据框看起来像这样:-
最后,我使用 group by 因为我希望获得某个标签在任何给定年份重复了多少次。然后我可以(稍后)过滤前三名。
df3_groupby = df3_new.groupby(['Tags']).size().reset_index(name='Count')
df3_groupby
注意上面的response和thankful是怎么重复的?让我们再试一组。
df3_groupby2 = df3_new.groupby(['Year', 'Tags'])['Year'].size().reset_index(name='Count')
df3_groupby2
value_counts呢?
我也尝试了一些其他的东西,比如删除 Body 列,为标签制作 set,但是,似乎什么都没有要工作了。
如果您能帮助我解决上述问题...或者是否有更好的方法来了解哪些问题标签在任何给定年份出现频率最高,我将不胜感激?
问题出在 space - 在 join
和 str.split
中需要 ,
有或没有 space:
import re
def my_function(x):
output = []
for s in re.findall("(?<=\<)(.*?)(?=\>)", x):
output.append(s)
#removed space
output2 = ",".join(output)
return output2
df3['Tags'] = [my_function(x) for x in df3['Tags']]
#here is , without space
df3_new = df3.assign(Tags=df3['Tags'].str.split(',')).explode('Tags')
import re
def my_function(x):
output = []
for s in re.findall("(?<=\<)(.*?)(?=\>)", x):
output.append(s)
#here is space after ,
output2 = ", ".join(output)
return output2
df3['Tags'] = [my_function(x) for x in df3['Tags']]
#added space to split
df3_new = df3.assign(Tags=df3['Tags'].str.split(', ')).explode('Tags')
但是更简单的是使用 Series.str.findall
来拆分列表,然后就不需要合并和拆分了:
df3_new = df3.assign(Tags=df3['Tags'].str.findall(r"(?<=\<)(.*?)(?=\>)")).explode('Tags')