如何在所有行上使用条件计算DataFrame中的列值?

时间:2017-08-24 15:58:20

标签: python pandas dataframe

假设我有一个如下所示的DataFrame:

A    B
xy   9
xc   34
xz   3

我如何处理pandas

if df[B] < 90, then df[B] = df[B]*10

会导致以下DataFrame

A    B
xy   90
xc   340
xz   30

4 个答案:

答案 0 :(得分:1)

在您的具体情况下,您可以执行以下操作:

df.loc[(df.A == "xy") & (df.B<90),"B"] = df.B*10 

相当于:

df.loc[(df["A"] == "xy") & (df["B"] <90),"B"] = df.B*10 

通常,使用loc定义要更改数据帧的位置,然后分配新值。这是一个一般的例子:

>>> import pandas as pd 
>>> df = pd.DataFrame([[1,2],[10,4],[5,4]], columns=["A","B"])
>>> df
    A  B
0   1  2
1  10  4
2   5  4
>>> df.loc[df.A <5,:]
   A  B
0  1  2
>>> df.loc[df.A <5,"B"] = df.B*10 
>>> df 
    A   B
0   1  20
1  10   4
2   5   4
>>> df 

修改

如果条件df.B*10对任何行有效,则根据您在下面的评论中提出的问题,以及您可以执行的操作,对所有列执行(df["A"] == "xy") & (df["B"] <90)

if any((df["A"] == "xy") & (df["B"] <90)):
    df.B = df.B*10 

答案 1 :(得分:1)

您可以使用

df.loc[(df['A'] == 'xy') & (df['B'] < 90), 'B']*=10

这会给你

    A   B
0   xy  90
1   xc  34
2   xz  3

这与您想要的输出不匹配,因为您的问题陈述表示如果By的值在xy&lt; 90

如果您希望获得已发布的输出,请使用

df.loc[(df['B'] < 90), 'B']*=10

你得到了

    A   B
0   xy  90
1   xc  340
2   xz  30

答案 2 :(得分:0)

loc是一个很好的方法

df.loc[(df.A=='xy')&(df.B<90),'B'] = 10*df.loc[(df.A=='xy')&(df.B<90),'B']

这就是说,基本上,A是xy,选择B列并乘以10。

答案 3 :(得分:0)

或者你可以尝试

df.B=np.where(df.B<90,df.B*10,df.B)

    A   B
0   xy  90
1   xc  340
2   xz  30

为了你额外的:

df.B*(np.where(df.loc[df.A=='xy','B']<90,10,1))