【问题标题】:Pandas dataframe change values when it meets dual criteriaPandas 数据框在满足双重标准时更改值
【发布时间】:2019-12-10 05:44:08
【问题描述】:

我有一个数据框,其数据如下:

Run_1   Run_2   Run_3 Avg
5.26    6.08    1.8   2
273     0       0     23  
5.26    6.08    1.8   1

它有形状

(2928, 501)

我想将所有值 > 0 更改为 0,并将当前所有值设置为 0 到 1,仅针对名称中包含子字符串 Run_ 的列。列数来自Run_1, Run_2, ... Run_500。条件更改不适用于除Run_1, Run_2, ... Run_500 之外的任何其他列。

所以,期望的输出是:

Run_1   Run_2   Run_3 Avg
0       0        0    2
0       1        1    23  
0       0        0   1

我尝试了以下方法:

    maxGen = np.max(df.filter(regex='Run_').values) + 5555.
    df.loc[df.filter(regex='Run_') > 0] = maxGen

但我得到了错误:

ValueError: cannot copy sequence with size 500 to array axis with dimension 2928

编辑: 数据框中没有负值。

【问题讨论】:

  • 将所有正值都改为零,负值呢,负值可能吗?

标签: python python-3.x pandas python-3.5


【解决方案1】:

你可以试试这个:

df.assign(**df.filter(like='Run_').eq(0).astype(int))

输出:

   Run_1  Run_2  Run_3  Avg
0      0      0      0    2
1      0      1      1   23
2      0      0      0    1

或者,如果您不喜欢“**”解包,请使用 join:

df.filter(like='Run_').eq(0).astype(int).join(df['Avg'])

【讨论】:

    【解决方案2】:

    转换应该可以工作

    df[[x for x in df.columns if 'Run_' in x]] = df[[x for x in df.columns if 'Run_' in x]].transform(lambda x: x.eq(0).astype(int))
    

    【讨论】:

      【解决方案3】:

      IIUC

      df.iloc[:,:-1]=(~df.astype(bool)).astype(int)
      df
      Out[54]: 
         Run_1  Run_2  Run_3  Avg
      0      0      0      0    2
      1      0      1      1   23
      2      0      0      0    1
      

      【讨论】:

        猜你喜欢
        • 2019-08-01
        • 2016-10-09
        • 1970-01-01
        • 2018-10-06
        • 2013-05-28
        • 1970-01-01
        • 2017-05-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多