Pandas DataFrame:根据条件

时间:2015-07-20 08:35:34

标签: python pandas dataframe

我有一个简单的DataFrame,如下所示:

Pandas DataFrame

我想从“第一季”列中选择所有值,并将那些超过1990年的值替换为1.在此示例中,只有Baltimore Ravens将1996年替换为1(保持其余数据完好无损)。

我使用了以下内容:

df.loc[(df['First Season'] > 1990)] = 1

但是,它将该行中的所有值替换为1,而不仅仅是“第一季”列中的值。

如何只替换该列中的值?

9 个答案:

答案 0 :(得分:130)

您需要选择该列:

In [41]:
df.loc[df['First Season'] > 1990, 'First Season'] = 1
df

Out[41]:
                 Team  First Season  Total Games
0      Dallas Cowboys          1960          894
1       Chicago Bears          1920         1357
2   Green Bay Packers          1921         1339
3      Miami Dolphins          1966          792
4    Baltimore Ravens             1          326
5  San Franciso 49ers          1950         1003

所以这里的语法是:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

您可以查看docs以及显示语义的10 minutes to pandas

修改

如果你想生成一个布尔指示符,那么你可以使用布尔条件生成一个布尔系列并将dtype转换为int这会将TrueFalse转换为{分别为{1}}和1

0

答案 1 :(得分:15)

聚会晚了一点,但仍然-我更喜欢在以下位置使用numpy:

import numpy as np
df['First Season'] = np.where(df['First Season'] > 1990, 1, df['First Season'])

答案 2 :(得分:6)

df['First Season'].loc[(df['First Season'] > 1990)] = 1

奇怪的是没有人得到这个答案,代码中唯一缺少的部分是df之后的['First Season'],只需删除其中的大括号即可。

答案 3 :(得分:2)

对于单个条件,即( 'employrate'] > 70 )

       country        employrate alcconsumption
0  Afghanistan  55.7000007629394            .03
1      Albania  51.4000015258789           7.29
2      Algeria              50.5            .69
3      Andorra                            10.17
4       Angola  75.6999969482422           5.57

使用此:

df.loc[df['employrate'] > 70, 'employrate'] = 7

       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   51.400002           7.29
2      Algeria   50.500000            .69
3      Andorra         nan          10.17
4       Angola    7.000000           5.57

因此这里的语法是:

df.loc[<mask>(here mask is generating the labels to index) , <optional column(s)> ]

对于多个条件,即(df['employrate'] <=55) & (df['employrate'] > 50)

使用此:

df['employrate'] = np.where(
   (df['employrate'] <=55) & (df['employrate'] > 50) , 11, df['employrate']
   )

out[108]:
       country  employrate alcconsumption
0  Afghanistan   55.700001            .03
1      Albania   11.000000           7.29
2      Algeria   11.000000            .69
3      Andorra         nan          10.17
4       Angola   75.699997           5.57

因此这里的语法是:

 df['<column_name>'] = np.where((<filter 1> ) & (<filter 2>) , <new value>, df['column_name'])

答案 4 :(得分:1)

df.loc[df['First season'] > 1990, 'First Season'] = 1

说明:

df.loc接受两个参数,“行索引”和“列索引”。我们正在检查该值是否大于“第一季”列下每个行值的27,然后将其替换为1。

答案 5 :(得分:0)

我们可以使用以下语法更新df中的“第一季”列:

df['First Season'] = expression_for_new_values

要映射“第一季”中的值,我们可以使用pandas的.map()方法,语法如下:

data_frame(['column']).map({'initial_value_1':'updated_value_1','initial_value_2':'updated_value_2'})

答案 6 :(得分:0)

另一种选择是使用列表推导式:

DATABASE_URL=org.jenkinsci.plugins.plaincredentials.impl.StringCredentialsImpl@81bf833e

答案 7 :(得分:-1)

df.First Season.loc[(df['First Season'] > 1990)] = 1

你去了。小菜一碟。不客气。

答案 8 :(得分:-2)

df["First season"] = df["First season"].apply(lambda x : 1 if x > 1990 else x)