我有:
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
value
col1
x
y
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
mrfwxfqh2#
EDIT:SNygard比我先想到了,但是我尝试提出一个解决方案,它利用了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])
2条答案
按热度按时间dgtucam11#
我们将首先获取
col1
中每个项目的累计计数:接下来,我们需要应用乘法by item:
给出最终结果:
mrfwxfqh2#
EDIT:SNygard比我先想到了,但是我尝试提出一个解决方案,它利用了panda的广播架构,并绕过了迭代的低效。
据说,当你遍历一个 Dataframe 的行时,你会因为将它用于一个它不打算用于的目的而失去Pandas的效率。
我会这样做: