pandas 根据某个值在另一列中出现的次数按常数增加值

omqzjyyz  于 2022-12-09  发布在  其他
关注(0)|答案(2)|浏览(106)

我有:

df=pd.DataFrame({'col1':['x','x','x','x','x','y','y','y','y','y','y','y'],
                 'value':[0,0,0,0,0,0,0,0,0,0,0,0]})

我想:

value列根据它在col1中出现的次数增加一个常数值。每次出现x,它增加100,每次出现y,它增加150

dgtucam1

dgtucam11#

我们将首先获取col1中每个项目的累计计数:

df['value'] = df.groupby('col1').cumcount()

接下来,我们需要应用乘法by item:

multiples = {
    'x': 100,
    'y': 150
}
for col, value in multiples.items():
    index = df['col1'] == col
    df.loc[index,'value'] *= value

给出最终结果:

col1    value
0   x   0
1   x   100
2   x   200
3   x   300
4   x   400
5   y   0
6   y   150
7   y   300
8   y   450
9   y   600
10  y   750
11  y   900
mrfwxfqh

mrfwxfqh2#

EDITSNygard比我先想到了,但是我尝试提出一个解决方案,它利用了panda的广播架构,并绕过了迭代的低效。

据说,当你遍历一个 Dataframe 的行时,你会因为将它用于一个它不打算用于的目的而失去Pandas的效率。
我会这样做:

import pandas as pd

col1_to_value_hash = {
    'x': 100,
    'y': 150
}

df = pd.DataFrame({
    'col1': ['x', 'x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'y', 'y', 'y'],
    'value': [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
})

cumcount = df.groupby('col1').cumcount()

df['value'] = cumcount * df['col1'].apply(lambda x: col1_to_value_hash[x])

相关问题