结合使用iloc和列表理解来设置值

时间:2019-11-23 19:18:10

标签: python pandas list-comprehension

我正在尝试使用列表推导来遍历数据框,并使用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)]

有人可以解释为什么上面的方法行不通吗?还是会怎样?

2 个答案:

答案 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

但是,我想这只是您用来说明问题的一个示例,因为有更好的方法来创建这种数据框。