我想计算熊猫数据框特定列上每个元素的频率,然后用频率出现次数标记每一行。
大多数常见解决方案是如何计算列的每个元素的频率,例如:count the frequency that a value occurs in a dataframe column
我有一个基本代码,例如:
df = pd.DataFrame({ 'A': ['foo', 'bar', 'g2g', 'g2g', 'g2g',
'bar', 'bar', 'foo', 'bar'],
'B': ['a', 'b', 'a', 'b', 'b', 'b', 'a', 'a', 'b'] })
print(df)
输出:
A B
0 foo a
1 bar b
2 g2g a
3 g2g b
4 g2g b
5 bar b
6 bar a
7 foo a
8 bar b
进一步:df['freq'] = df.groupby('B')['B'].transform('count')
输出:
A B freq
0 foo a 4
1 bar b 5
2 g2g a 4
3 g2g b 5
4 g2g b 5
5 bar b 5
6 bar a 4
7 foo a 4
8 bar b 5
在按“ B”列分组后,我想要以下内容:
A B freq_occurance
0 foo a 1
1 bar b 1
2 g2g a 2
3 g2g b 2
4 g2g b 3
5 bar b 4
6 bar a 3
7 foo a 4
8 bar b 5
这意味着,如果列“ B”中的值“ a”具有频率4,则出现“ a”的第一行将被标记为1,第二行具有“ a”的行将被标记为2,依此类推。 。此逻辑适用于“ B”列下的所有唯一值。
答案 0 :(得分:1)
您可以使用transform并将索引(在reset_index之后)作为值,然后加上一个(新索引从0开始)。
df['freq2'] = df.groupby('B')['B'].transform(lambda x: x.reset_index().index).add(1)
A B freq freq2
0 foo a 4 1
1 bar b 5 1
2 g2g a 4 2
3 g2g b 5 2
4 g2g b 5 3
5 bar b 5 4
6 bar a 4 3
7 foo a 4 4
8 bar b 5 5
答案 1 :(得分:0)
cumcount
是您所需要的:
df['freq_occurance'] = df.groupby('B').cumcount() + 1