我正在尝试使用列表推导来遍历数据框,并使用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)]
有人可以解释为什么上面的方法行不通吗?还是会怎样?
答案 0 :(得分:0)
这不起作用,因为列表理解需要在其最左侧的位置放置Python expression 。
[df.iloc[i,j] = 5 for i in range(10) for j in range(10)]
^^^^^^^^^^^^^^^^
# This is a statement, not an expression.
这是Python语言语法的结果,该语法在此处正式指定:Python 3 Full Grammar specification
我认为,您可以重写此方法以使用高级索引。为了清楚起见,对行和列使用不同的尺寸:
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
您可以分配“ fancy indexing”,即在列表中提供索引:
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 3
答案 1 :(得分:0)
您在listcomp内执行赋值语句df.iloc[i,j] = 5
,所以它不起作用。 df.iloc[i,j] = 5
不返回任何内容供listcomp创建列表,并且listcomp不允许语句。您需要在listcomp之外的assigment语句。您的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
但是,我想这只是您用来说明问题的一个示例,因为有更好的方法来创建这种数据框。