pandas 添加列以反映列中出现的值的数量

zxlwwiss  于 2023-03-11  发布在  其他
关注(0)|答案(3)|浏览(173)

我有一个数据框,看起来像这样:

df = pd.DataFrame({"Name":['a','a','a','b','b','c'],
                   "Year":[2019, 2020, 2021, 2015, 2019, 2011]})
print(df)
Name  Year
0    a  2019
1    a  2020
2    a  2021
3    b  2015
4    b  2019
5    c  2011

我想添加一列,以反映名称出现的次数。例如,当“a”出现在第一行时,“Occurrences”列将显示“1”。当“a”再次出现时(数据已排序),“Occurrences”列将显示“2”,依此类推:

Name  Year  Occurrences
0    a  2019            1
1    a  2020            2
2    a  2021            3
3    b  2015            1
4    b  2019            2
5    c  2011            1

我曾经考虑过使用某种for循环来实现这一点,但我不太确定如何去做。
先谢了!

ergxz8rk

ergxz8rk1#

下面是使用pandas.core.groupby.GroupBy.cumcount的方法

df['Occurrences'] = df.groupby('Name').cumcount() + 1 
print(df)
Name  Year  Occurrences
0    a  2019            1
1    a  2020            2
2    a  2021            3
3    b  2015            1
4    b  2019            2
5    c  2011            1
ni65a41a

ni65a41a2#

有类似的帖子,你可以查看这个答案@Andrej Kesely:

df["Occurrences"] = df.groupby("Name")["Year"].apply(lambda x: x.groupby(x).ngroup() + 1)
rpppsulh

rpppsulh3#

您可以使用以下代码完成此操作:

df['Occurances'] = df.sort_values(['Name', 'Year']).groupby('Name').cumcount() + 1

其工作原理如下:
1.使用.sort_values()Name后接Year的顺序对行进行排序(这样即使行未排序也能正常工作)。
1.使用.groupby()Name对行进行分组。
1.使用.cumcount()计算每个组中行数的累计,并输出为单个Series。
(Each运行总计将从0开始,因此将1加到结果以获得真实计数)。
1.将结果赋给名为Occurances的新列。

测试未排序的DataFrame

输入数据(未排序):
x一个一个一个一个x一个一个二个x
创建Occurances列:

df['Occurances'] = df.sort_values(['Name', 'Year']).groupby('Name').cumcount() + 1

print(df)

输出:

Name  Year  Occurances
0    a  2020           2
1    a  2019           1
2    b  2015           1
3    a  2021           3
4    c  2011           1
5    b  2019           2

分类输出:

df_sorted = df.sort_values(['Name', 'Year'], ignore_index=True)

print(df_sorted)
Name  Year  Occurances
0    a  2019           1
1    a  2020           2
2    a  2021           3
3    b  2015           1
4    b  2019           2
5    c  2011           1

相关问题