我试图使用列表理解来迭代数据,并使用iloc为位置设置一个新的值。我已经证实它正在正确地迭代。
import pandas as pd
import numpy as np
df = pd.DataFrame([np.arange(10)]*10)
#working
for i in range(10):
for j in range(10):
df.iloc[i,j] = 0+i
#not working
[df.iloc[i,j] = 5 for i in range(10) for j in range(10)]有人能解释一下为什么上面的话行不通吗?或者是什么?
发布于 2019-11-23 19:31:59
您在listcomp中做赋值语句df.iloc[i,j] = 5,所以它不起作用。df.iloc[i,j] = 5不返回让listcomp创建列表的任何内容,listcomp不允许语句。您需要在listcomp之外的辅助语句。你的列表可能会改变到这个
df[:] = [[5 for j in range(10)] for i in range(10)]
Out[17]:
0 1 2 3 4 5 6 7 8 9
0 5 5 5 5 5 5 5 5 5 5
1 5 5 5 5 5 5 5 5 5 5
2 5 5 5 5 5 5 5 5 5 5
3 5 5 5 5 5 5 5 5 5 5
4 5 5 5 5 5 5 5 5 5 5
5 5 5 5 5 5 5 5 5 5 5
6 5 5 5 5 5 5 5 5 5 5
7 5 5 5 5 5 5 5 5 5 5
8 5 5 5 5 5 5 5 5 5 5
9 5 5 5 5 5 5 5 5 5 5但是,我想这只是一个您用来展示问题的例子,因为有更好的方法来创建这样的dataframe。
发布于 2019-11-23 19:20:38
这是行不通的,因为列表理解需要一个位于其最左边的Python表达式。
[df.iloc[i,j] = 5 for i in range(10) for j in range(10)]
^^^^^^^^^^^^^^^^
# This is a statement, not an expression.这是Python语法的结果,在这里正式指定了:Python3全语法规范
我想你可以重写这个来使用高级索引。为清晰起见,对行和列使用不同的尺寸:
import pandas
import numpy
df = pandas.DataFrame([numpy.arange(4)]*7)之后,df是:
0 1 2 3
0 0 1 2 3
1 0 1 2 3
2 0 1 2 3
3 0 1 2 3
4 0 1 2 3
5 0 1 2 3
6 0 1 2 3您可以使用“想像力索引”来分配,即在列表中提供索引:
df.iloc[[0, 2, 4], [2]] = 100
df.iloc[list(range(6)), list(range(2))] = 125之后,df是:
0 1 2 3
0 125 125 100 3
1 125 125 2 3
2 125 125 100 3
3 125 125 2 3
4 125 125 100 3
5 125 125 2 3
6 0 1 2 3https://stackoverflow.com/questions/59011286
复制相似问题