Allentro
Allentro

Reputation: 416

Edit rows of a dataframe given one column has a certain value

I have a large dataframe df_trial, with a row nammed reaction. Within this there are five values which this may be: 152Gd-p, 154Gd-p, 155Gd-p, 156Gd-p, 15Gd-p, 158Gd-p, 160Gd-p. The following column contains some irrelevant information for this step, however the following columns I wish to be multiplied by a constant depending on the string present in 'reaction'. I have tried to apply this as:

for index, row in df_trial.iterrows():
    if row['reaction'] == '152Gd-p':
        row[2:]*=0.002
    if row['reaction'] == '154Gd-p':
        row[2:]*=0.0218
    if row['reaction'] == '155Gd-p':
        row[2:]*=0.148
    if row['reaction'] == '156Gd-p':
        row[2:]*=0.2047
    if row['reaction'] == '157Gd-p':
        row[2:]*=0.1565
    if row['reaction'] == '158Gd-p':
        row[2:]*=0.2484
    if row['reaction'] == '160Gd-p':
        row[2:]*=0.2186

This is however not multiplying the values in the rows.

Here is a sample of how my dataframe looks:

        reaction    product 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0 ... 35.5    36.0    36.5    37.0    37.5    38.0    38.5    39.0    39.5    40.0
81  155Gd-p 062150.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 1.101530e-02    1.253720e-02    1.404620e-02    1.562480e-02    1.713510e-02    1.855860e-02    1.989160e-02    2.113160e-02    2.228710e-02    2.333700e-02
82  155Gd-p 065156.L00  0.0 0.0 0.0 0.0 2.842720e-10    4.331690e-09    3.176340e-08    1.873100e-03    ... 1.836500e-01    1.803630e-01    1.728360e-01    1.606180e-01    1.685970e-01    1.679980e-01    1.639340e-01    1.538330e-01    1.639280e-01    1.656980e-01
83  155Gd-p 063149.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 6.990920e+00    7.877440e+00    8.781220e+00    9.594980e+00    1.034780e+01    1.097080e+01    1.156940e+01    1.196730e+01    1.230900e+01    1.241800e+01
84  155Gd-p 061146.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    9.529110e-04
85  155Gd-p 061147.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 1.000000e-07    1.000000e-07    1.000000e-07    1.000000e-07    1.000000e-07    1.063060e-03    1.130870e-03    1.172590e-03    1.180610e-03    1.165960e-03
86  155Gd-p 062151.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    1.000000e-07    1.000000e-07    ... 1.041300e-03    1.076720e-03    1.090690e-03    1.109420e-03    1.137780e-03    1.135450e-03    1.128680e-03    1.149190e-03    1.143860e-03    1.150390e-03
87  155Gd-p 063154.L00  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 3.173660e+00    3.444480e+00    3.724070e+00    4.007600e+00    4.323930e+00    4.673050e+00    4.971810e+00    5.346970e+00    5.661720e+00    6.060110e+00
88  155Gd-p 064150.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 2.579220e-03    4.992070e-03    9.679620e-03    2.035170e-02    3.447910e-02    5.437450e-02    9.089650e-02    1.471190e-01    2.126190e-01    2.896810e-01
89  155Gd-p 064154.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 2.337670e+02    2.386140e+02    2.390300e+02    2.431350e+02    2.413420e+02    2.446070e+02    2.421500e+02    2.447660e+02    2.425080e+02    2.446910e+02
90  155Gd-p 062148.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    1.172560e-03    1.722920e-03
91  155Gd-p 061148.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 1.000000e-07    1.000000e-07    1.000000e-07    1.000000e-07    1.000000e-07    6.300980e-05    6.278910e-05    6.094680e-05    5.998620e-05    5.900480e-05
92  155Gd-p 063153.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 3.136120e+00    3.390600e+00    3.631630e+00    3.958020e+00    4.197170e+00    4.564750e+00    4.762130e+00    4.948580e+00    5.314960e+00    5.549590e+00
93  155Gd-p 063152.tot  0.0 0.0 0.0 0.0 1.000000e-07    1.000000e-07    1.000000e-07    1.000000e-07    ... 2.371420e+00    2.502180e+00    2.629100e+00    2.699470e+00    2.818750e+00    2.972010e+00    3.188610e+00    3.416830e+00    3.648320e+00    3.884690e+00
94  155Gd-p 065151.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 6.969380e+01    1.072870e+02    1.483310e+02    1.996210e+02    2.548350e+02    3.046590e+02    3.501350e+02    3.969820e+02    4.371780e+02    4.748900e+02
95  155Gd-p 063150.L01  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 2.297790e+00    2.303140e+00    2.279280e+00    2.212180e+00    2.171240e+00    2.134990e+00    2.086730e+00    2.017590e+00    1.979700e+00    1.957500e+00
96  155Gd-p 065152.tot  0.0 0.0 0.0 0.0 0.000000e+00    0.000000e+00    0.000000e+00    0.000000e+00    ... 7.834620e+02    7.493000e+02    7.095910e+02    6.583400e+02    6.050390e+02    5.525560e+02    5.055030e+02    4.521510e+02    4.095180e+02    3.664050e+02

Obviously in the full dataframe it includes rows with all of the reactions in.

Upvotes: 1

Views: 56

Answers (1)

Alexandre B.
Alexandre B.

Reputation: 5502

You can define a function to multiply each row and then apply it to each row with apply.

Also, to improve the conditions, you can set elif instead of if. That prevents testing all the conditions each time.

In the answer, I use a dictionary to save the coefficient. Then, I call it from the reaction key.

Here the code:

# Coefficients
multi_coef = {
    '152Gd-p': 0.002,
    '154Gd-p': 0.0218,
    '155Gd-p': 0.148,
    '156Gd-p': 0.2047,
    '157Gd-p': 0.1565,
    '158Gd-p': 0.2484,
    '160Gd-p': 0.2186,
}
# Get columns name
columns = df.columns

# Function to apply to each row
def multiply_coef(row):
    # If the reaction name is in the dictionary
    if row.reaction in multi_coef.keys():
        # Multiply by the reaction coefficient
        row[columns[2:]] = row[columns[2:]] * multi_coef[row.reaction]
    return row

# Apply the function (axis = 1 means over rows)
new_df = df.apply(multiply_coef, axis=1)

print(new_df)
#    reaction     product  0.5  1.0  1.5  2.0  ...          37.5       38.0       38.5       39.0       39.5       40.0
# 0   155Gd-p  062150.tot  0.0  0.0  0.0  0.0  ...  2.535995e-03   0.002747   0.002944   0.003127   0.003298   0.003454
# 1   155Gd-p  065156.L00  0.0  0.0  0.0  0.0  ...  2.495236e-02   0.024864   0.024262   0.022767   0.024261   0.024523
# 2   155Gd-p  063149.tot  0.0  0.0  0.0  0.0  ...  1.531474e+00   1.623678   1.712271   1.771160   1.821732   1.837864
# 3   155Gd-p  061146.tot  0.0  0.0  0.0  0.0  ...  0.000000e+00   0.000000   0.000000   0.000000   0.000000   0.000141
# 4   155Gd-p  061147.tot  0.0  0.0  0.0  0.0  ...  1.480000e-08   0.000157   0.000167   0.000174   0.000175   0.000173
# 5   155Gd-p  062151.tot  0.0  0.0  0.0  0.0  ...  1.683914e-04   0.000168   0.000167   0.000170   0.000169   0.000170
# 6   155Gd-p  063154.L00  0.0  0.0  0.0  0.0  ...  6.399416e-01   0.691611   0.735828   0.791352   0.837935   0.896896
# 7   155Gd-p  064150.tot  0.0  0.0  0.0  0.0  ...  5.102907e-03   0.008047   0.013453   0.021774   0.031468   0.042873
# 8   155Gd-p  064154.tot  0.0  0.0  0.0  0.0  ...  3.571862e+01  36.201836  35.838200  36.225368  35.891184  36.214268
# 9   155Gd-p  062148.tot  0.0  0.0  0.0  0.0  ...  0.000000e+00   0.000000   0.000000   0.000000   0.000174   0.000255
# 10  155Gd-p  061148.tot  0.0  0.0  0.0  0.0  ...  1.480000e-08   0.000009   0.000009   0.000009   0.000009   0.000009
# 11  155Gd-p  063153.tot  0.0  0.0  0.0  0.0  ...  6.211812e-01   0.675583   0.704795   0.732390   0.786614   0.821339
# 12  155Gd-p  063152.tot  0.0  0.0  0.0  0.0  ...  4.171750e-01   0.439857   0.471914   0.505691   0.539951   0.574934
# 13  155Gd-p  065151.tot  0.0  0.0  0.0  0.0  ...  3.771558e+01  45.089532  51.819980  58.753336  64.702344  70.283720
# 14  155Gd-p  063150.L01  0.0  0.0  0.0  0.0  ...  3.213435e-01   0.315979   0.308836   0.298603   0.292996   0.289710
# 15  155Gd-p  065152.tot  0.0  0.0  0.0  0.0  ...  8.954577e+01  81.778288  74.814444  66.918348  60.608664  54.227940

Upvotes: 1

Related Questions