pandas 我想为panda Dataframe 中的每一列创建一个新的频率列

ikfrs5lh  于 2023-02-11  发布在  其他
关注(0)|答案(2)|浏览(130)

假设我有这样一个 Dataframe :
| 颜色|动物|
| - ------|- ------|
| 黄色|猫|
| 黄色|猫|
| 红色|猫|
| 红色|猫|
| 蓝色|猫|
我想为每列创建一列,显示每个值出现的频率:
| 颜色|颜色_频率|动物|动物_频率|
| - ------|- ------|- ------|- ------|
| 黄色|百分之四十|猫|百分之百|
| 黄色|百分之四十|猫|百分之百|
| 红色|百分之四十|猫|百分之百|
| 红色|百分之四十|猫|百分之百|
| 蓝色|百分之二十|猫|百分之百|
我试过了

frequency = list()
for column in df.columns:
     series = (df[column].value_counts(normalize=True, dropna=True)*100)
     overview.append(series)

#overview list
o_colors = overview[0] 
o_animals = overview[1]

df['animals_frequency'] = o_animals

如果我尝试

df.info()

它返回
| 色谱柱|非空|计数|D型|
| - ------|- ------|- ------|- ------|
| 动物_频率|无|非零|浮动64|

sqxo8psd

sqxo8psd1#

一种简单的方法是计算每个列值的相对频率,然后将这些频率连接回原始DataFrame。

for col in df.columns:
    # Get relative frequency
    frequency = df[col].value_counts(normalize=True)

    # Format frequency as percent values, rounded to two decimals
    frequency_percent = (frequency*100).round(2).astype(str) + '%'

    # Join frequency values to original DF
    frequency_percent.name = f"{col}_frequency"
    df = df.merge(frequency_percent.to_frame(), left_on=col, right_index=True)
quhf5bfb

quhf5bfb2#

对于每列,计算每个不同元素的频率,然后使用replace将每个元素Map到相应的频率

for column in df.columns:
    mapping = df[column].value_counts(normalize=True, dropna=True) * 100
    df[f"{column}_frequency"] = df[column].replace(mapping)

相关问题