如何在python中对列执行条件操作?

如何在python中对列执行条件操作?,python,pandas,Python,Pandas,我试图编写一个代码,计算“prod”(“rgdpna”/“emp”)相对于一个特定年份的变化。在excel数据中,包含来自多个国家的数据,我需要为所有国家执行 (国家、年份、rgdpna和emp是excel中的数据) 类似这样:“prodvar=(“年”>=1980时的“prod”)除以(“年”==1980时的“prod”) 我想我需要用“while”,但我不知道 df["prod"] = df["rgdpna"].div (df["emp"]) 首先,让我们将您的数据放入一个完整的、最少的示

我试图编写一个代码,计算“prod”(“rgdpna”/“emp”)相对于一个特定年份的变化。在excel数据中,包含来自多个国家的数据,我需要为所有国家执行

(国家、年份、rgdpna和emp是excel中的数据)

类似这样:“prodvar=(“年”>=1980时的“prod”)除以(“年”==1980时的“prod”)

我想我需要用“while”,但我不知道

df["prod"] = df["rgdpna"].div (df["emp"])

首先,让我们将您的数据放入一个完整的、最少的示例中。因此,我们不需要中间列,因此让我们只保留相关列,并将其称为“值”,以清晰起见:

data_dict = {'country': {0: 'Brazil',
  1: 'Brazil',
  2: 'Brazil',
  3: 'Canada',
  4: 'Canada',
  5: 'Canada'},
 'value': {0: 8.3, 1: 10, 2: 9.3, 3: 27.2, 4: 32.7, 5: 41.6},
 'year': {0: 1980.0, 1: 1981.0, 2: 1982.0, 3: 1980.0, 4: 1981.0, 5: 1982.0}}

df = pd.DataFrame(data_dict)
(我在回答的其余部分也使用了清晰的列名,即使它们很长)

其次,我们将创建一个“中间值”列,该列仅保存1980年时的值:

df['value_1980'] = df.apply(lambda row: df.set_index(['year','country']).loc[1980]['value'][row['country']], axis=1)
最后,我们将两者分开,如您的示例所示:

df['value_relative_to_1980'] = df['value'] / df['value_1980']

检查结果。

对于熊猫,尽可能避免使用For和while循环

试试这个

df['prod'] = df.apply(lambda x: x['prod']/df['prod'].loc[(df['year']==1980)&(df['country']==x['country'])].values[0], axis=1)

请检查如何制作一个,这样我们可以帮助您。你的预期结果是什么?我编辑了你的问题,将逗号改为小数点。以后,请把你的数据例子放在你正在使用的语言中:在代码块中间使用错误的语法是非常非常令人困惑的。但是我不知道。这太模糊了,Stack Overflow不是免费的代码编写服务,也不是为了提供个性化的指南和教程。请看:,,没问题。一般来说,除了我给出的具体答案之外,您还需要使用“apply”函数。它是您在pandas中最好的朋友之一,特别是因为如果您需要升级,还有其他库可以让它运行得更快。根据我的经验,它几乎总能及时完成工作。如果希望该列以另一列为条件,请对该列使用apply:``df['new\u col']=df['old\u col'].apply()``对于多个列,请对df本身使用apply函数并指定axis=1。。。评论是针对我的吗?我在回答中使用了
.apply
。哦,我很抱歉,我把用户名弄糊涂了,还以为你就是原来的海报。
df['prod'] = df.apply(lambda x: x['prod']/df['prod'].loc[(df['year']==1980)&(df['country']==x['country'])].values[0], axis=1)