我正在尝试编写一个 for 循环,它将迭代数据帧中索引的子集,每个循环返回一个仅更改一行的数据帧。
这里有一些虚拟代码来演示我的意思:
# Two columns of random numbers
df = pd.DataFrame(np.random.randn(10,2),columns=list('ab'))
# The index values where row 'a' > 0
indices = df.loc[df['a'] > 0].index
这就是我尝试做的事情:
for index in indices:
dummy = df
dummy.loc[index,'a'] = 'Hello'
dummy.loc[index,'b'] = 'World'
print(dummy)
返回结果:
a b
0 -1.30278 0.592978
1 Hello World
2 0.0113196 0.441662
3 1.59222 -0.152032
4 -0.293761 -0.519106
5 -0.402177 1.27412
6 1.24692 -0.203043
7 0.232682 -1.29515
8 -1.03781 0.89598
9 0.000474012 0.572173
a b
0 -1.30278 0.592978
1 Hello World
2 Hello World
3 1.59222 -0.152032
4 -0.293761 -0.519106
5 -0.402177 1.27412
6 1.24692 -0.203043
7 0.232682 -1.29515
8 -1.03781 0.89598
9 0.000474012 0.572173
a b
0 -1.30278 0.592978
1 Hello World
2 Hello World
3 Hello World
4 -0.293761 -0.519106
5 -0.402177 1.27412
6 1.24692 -0.203043
7 0.232682 -1.29515
8 -1.03781 0.89598
9 0.000474012 0.572173
等等...
我试图在 dummy = df
行的每次迭代中重置 a
和 b
值,但它不起作用正如我所期望的那样。
但我希望它产生的是:
a b
0 -1.30278 0.592978
1 Hello World
2 0.0113196 0.441662
3 1.59222 -0.152032
4 -0.293761 -0.519106
5 -0.402177 1.27412
6 1.24692 -0.203043
7 0.232682 -1.29515
8 -1.03781 0.89598
9 0.000474012 0.572173
a b
0 -1.30278 0.592978
1 0.74578 0.482945
2 Hello World
3 1.59222 -0.152032
4 -0.293761 -0.519106
5 -0.402177 1.27412
6 1.24692 -0.203043
7 0.232682 -1.29515
8 -1.03781 0.89598
9 0.000474012 0.572173
a b
0 -1.30278 0.592978
1 0.74578 0.482945
2 0.01131 0.441662
3 Hello World
4 -0.293761 -0.519106
5 -0.402177 1.27412
6 1.24692 -0.203043
7 0.232682 -1.29515
8 -1.03781 0.89598
9 0.000474012 0.572173
等等...
任何帮助将不胜感激!
最佳答案
您可能期望 dummy = df
制作 df
的副本。 dummy
实际上指向与 df
相同的底层对象,因此对 dummy
所做的任何更改都会对 df
进行,如下所示出色地。您可以通过复制 df 来解决此问题,但更简单、更有效的方法是在打印之前保存原始值,然后在打印后恢复它们。
for index in indices:
orig_values = df.loc[index, ['a', 'b']]
df.loc[index, ['a', 'b']] = ['Hello', 'World']
print(df)
df.loc[index, ['a', 'b']] = orig_values
关于python - 在 Pandas 数据框中一次更改一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52878004/