我有一个像这样的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
提前致谢
答案 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。