如何根据函数替换pandas数据框中的值

时间:2017-10-18 05:04:58

标签: python pandas numpy dataframe

我有一个像这样的pandas数据框

 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 

提前致谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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