我有一个这样的数据框,

ID    00:00  01:00  02:00  ...   23:00   avg_value
22      4.7     5.3     6   ...    8         5.5
37       0      9.2    4.5  ...    11.2      9.2
4469     2      9.8    11   ...    2         6.4


我可以使用np.where一次将条件应用于多个列吗?
我想将00:00到23:00的值更新为01。如果一天中的值大于avg_value,则将其更改为1,否则将其更改为0

我知道如何将此方法应用于单个列。

np.where(df['00:00']>df['avg_value'],1,0)


我可以将其更改为多列吗?

输出会像

ID    00:00  01:00  02:00  ...   23:00   avg_value
22      0     1       1    ...      1       5.5
37      0     0       0    ...      1       9.2
4469    0     1       1    ...      0       6.4

最佳答案

选择所有不带DataFrame.iloc的列,按DataFrame.gt比较,并强制转换为integer,最后按avg_value添加DataFrame.join列:

df = df.iloc[:, :-1].gt(df['avg_value'], axis=0).astype(int).join(df['avg_value'])
print (df)
      00:00  01:00  02:00  23:00  avg_value
ID
22        0      0      1      1        5.5
37        0      0      0      1        9.2
4469      0      1      1      0        6.4


或使用DataFrame.pop提取列:

s = df.pop('avg_value')
df = df.gt(s, axis=0).astype(int).join(s)
print (df)
      00:00  01:00  02:00  23:00  avg_value
ID
22        0      0      1      1        5.5
37        0      0      0      1        9.2
4469      0      1      1      0        6.4


因为如果分配给相同的列,则整数将转换为浮点数(这是错误):

df.iloc[:, :-1] = df.iloc[:, :-1].gt(df['avg_value'], axis=0).astype(int)
print (df)
      00:00  01:00  02:00  23:00  avg_value
ID
22      0.0    0.0    1.0    1.0        5.5
37      0.0    0.0    0.0    1.0        9.2
4469    0.0    1.0    1.0    0.0        6.4

关于python - 根据python中的条件更新多个列值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60258422/

10-12 22:04