【问题标题】:How to replace values in pandas data frame according to a function如何根据函数替换熊猫数据框中的值
【发布时间】:2017-10-21 03:29:46
【问题描述】:

我有一个看起来像这样的熊猫数据框

 0  1   2   3   4   5   6   7   8   9   ... 253 254 255 256 257 258 259 260 261 262
        0       30  84  126 135 137 179 242 342 426 ... 0   0   0   0   0   0   0   0   0   0
        1       24  53  75  134 158 192 194 211 213 ... 0   0   0   0   0   0   0   0   0   0
        2       51  143 173 257 446 491 504 510 559 ... 0   0   0   0   0   0   0   0   0   0
        3       1   20  22  92  124 149 211 335 387 ... 0   0   0   0   0   0   0   0   0   0
        4       34  51  56  106 110 121 163 233 266 ... 0   0   0   0   0   0   0   0   0   0

我想将数据框中的每个数字除以 7 并将结果而不是数字放入数据框中,我正在使用 for 循环进行测试,但它 不适合我

for i in x:
    y = i % 7
    if y == 0:
        x.replace(i, 7)

它应该可以工作,但是当我打印数据框时我看不到变化,我什至尝试替换一个特定的值,但也没有变化。

我应该怎么做,我想知道什么是内存方面的最佳解决方案,因为我正在尝试将其扩展到更大的数据框

假设我们有这样的一行

 0 8 30 28 36 40 45 0 56 

我想要的输出应该是,

 0 1 2 7 1 5 3 0 7 

提前致谢

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    使用numpy.where 和链式条件检查0

    print (df)
       0   1    2    3    4    5    6    7    8    9  253  254  255  256  257
    0  0   8   30   28   36   40   45    0   56  426    0    0    0    0    0
    1  1  24   53   75  134  158  192  194  211  213    0    0    0    0    0
    2  2  51  143  173  257  446  491  504  510  559    0    0    0    0    0
    3  3   1   20   22   92  124  149  211  335  387    0    0    0    0    0
    4  4  34   51   56  106  110  121  163  233  266    0    0    0    0    0
    
    mdf = df % 7
    df = pd.DataFrame(np.where((mdf == 0) & (df != 0), 7, mdf),
                      columns=df.columns, 
                      index=df.index)
    print (df)
       0  1  2  3  4  5  6  7  8  9  253  254  255  256  257
    0  0  1  2  7  1  5  3  0  7  6    0    0    0    0    0
    1  1  3  4  5  1  4  3  5  1  3    0    0    0    0    0
    2  2  2  3  5  5  5  1  7  6  6    0    0    0    0    0
    3  3  1  6  1  1  5  2  1  6  2    0    0    0    0    0
    4  4  6  2  7  1  5  2  2  2  7    0    0    0    0    0
    

    【讨论】:

    • 好吧,这几乎是我要找的东西,但我想排除所有零的意思,让零单独处理其他值,或者我是否可以用另一个替换掩码中的零值说 7,因为它们代表不同的标签
    • 7参数代表什么
    • 所以你不想只用0 替换列?
    • 不,我想用另一个值替换这个掩码产生的零,以区分它和之前存在的零,因为这个数据代表不同星期的天,零意味着没有天,但在那个掩码零将代表星期天和他没有出现的日子
    • 你能添加想要的输出吗?
    【解决方案2】:

    DataFrame 方法df.apply() 将对每个单元格应用一个函数。该函数的第一个参数将是单元格的内容。

    import pandas as pd
    
    # Just an example df
    df = pd.DataFrame(data={"Column1":[7*x for x in range(1,11)], "Column2":[7*x for x in range(11,21)]})
    
    print(df)
    
       Column1  Column2
    0        7       77
    1       14       84
    2       21       91
    3       28       98
    4       35      105
    5       42      112
    6       49      119
    7       56      126
    8       63      133
    9       70      140
    

    下面是一个简单的函数和应用它。

    请注意,您需要将结果存储在一个新变量中(它会显示结果,但不会更改原始 DataFrame)。

    该函数假定 Python 3。 如果使用 Python 2 division works differently

    def divide_by_7(x):
    
        return x / 7
    
    df2 = df.apply(divide_by_7)
    
    print(df2)
    
       Column1  Column2
    0      1.0     11.0
    1      2.0     12.0
    2      3.0     13.0
    3      4.0     14.0
    4      5.0     15.0
    5      6.0     16.0
    6      7.0     17.0
    7      8.0     18.0
    8      9.0     19.0
    9     10.0     20.0
    

    使用参数不仅仅是单元格内容的函数需要在apply() 方法中使用“args”参数。

    # A more flexible division function
    def divide_by_n(x, n):
    
        return x / n
    
    #If passing in arguments, pass them as a tuple to args parameter
    df3 = df.apply(divide_by_n, args=(7,))
    
    print(df3)
    
       Column1  Column2
    0      1.0     11.0
    1      2.0     12.0
    2      3.0     13.0
    3      4.0     14.0
    4      5.0     15.0
    5      6.0     16.0
    6      7.0     17.0
    7      8.0     18.0
    8      9.0     19.0
    9     10.0     20.0
    

    还有其他使用apply()的细节,例如申请创建新列。有examples in the pandas documentation

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-23
    • 2020-10-21
    • 2019-02-02
    • 2018-09-29
    • 2020-12-31
    相关资源
    最近更新 更多