首页 > 解决方案 > 根据其他列的值转换或更改列的值

问题描述

我有一个包含 5 列的数据框。我想做的是将最后 4 列更改为第一列。

基本上,如果第一列的值低于某个阈值,则修改以下列,如果该值高于阈值,则没有变化。

所以我尝试了这个:

import pandas as pd
df = pd.DataFrame({
  'col1' : [0.1, 0.3, 0.1, 0.2],
  'col2' : [2,4,3,7],
  'col3' : [3,4,4,9],
  'col4' : [4,2,2,6],
  'col5' : [0.3, 2.1, 1.0, .9],
})

def motif(col1, col2, col3, col4, col5):
  col2 = col2
  col3 = col3
  col4 = col4
  col5 = col5
  if col1 <=.15:
    col2 = col2 * .15
    col3 = col3 * .15
    col4 = col4 * .15
    col5 = col5 * .15
    return col2, col3, col4, col5
  else:
    return col2, col3, col4, col5

df.apply(lambda x: modify(x[col1], x[col2], x[col3], x[col4], x[col5]), axis=1)


但这不起作用。如果您有任何想法,我将不胜感激

标签: pythonpandasdataframe

解决方案


我们可以使用loc选择col1小于或等于的行,.15然后将其余列乘以.15

df.loc[df['col1'] <= 0.15, 'col2':] *= 0.15

df

   col1  col2  col3  col4   col5
0   0.1  0.30  0.45   0.6  0.045
1   0.3  4.00  4.00   2.0  2.100
2   0.1  0.45  0.60   0.3  0.150
3   0.2  7.00  9.00   6.0  0.900

col2如果后面的所有列都过于宽泛,那么其他列选择自然会起作用:

df.loc[df['col1'] <= 0.15, ['col2', 'col3', 'col4', 'col5']] *= 0.15
df.loc[df['col1'] <= 0.15, 'col2':'col5'] *= 0.15

如果不同的列需要不同的修改,也可以保存和重复使用掩码:

m = df['col1'] <= 0.15
df.loc[m, 'col2':'col4'] *= 0.15
df.loc[m, 'col5'] *= 0.5  # col5 is different than col2-4

df

   col1  col2  col3  col4  col5
0   0.1  0.30  0.45   0.6  0.15
1   0.3  4.00  4.00   2.0  2.10
2   0.1  0.45  0.60   0.3  0.50
3   0.2  7.00  9.00   6.0  0.90

apply可以工作(虽然它更慢并且代码更多),但是由于apply可以产生聚合和未聚合的结果,因此需要明确定义覆盖的列,并且结果需要是 a Seriesnot a tuple

def modify(col1, col2, col3, col4, col5):
    if col1 <= .15:
        col2 = col2 * .15
        col3 = col3 * .15
        col4 = col4 * .15
        col5 = col5 * .15
    return pd.Series([col2, col3, col4, col5])


df[['col2', 'col3', 'col4', 'col5']] = df.apply(lambda x: modify(
    x['col1'], x['col2'], x['col3'], x['col4'], x['col5']
), axis=1)

df

   col1  col2  col3  col4   col5
0   0.1  0.30  0.45   0.6  0.045
1   0.3  4.00  4.00   2.0  2.100
2   0.1  0.45  0.60   0.3  0.150
3   0.2  7.00  9.00   6.0  0.900

推荐阅读