我正在使用iterrows()遍历数据框。使用for循环和嵌套的if语句,我可以识别要更改的单元格。 我使用打印语句来验证是否可以更改数据,但是当我打印出数据框时,信息不变。我能够在较小的数据框上执行此操作。有什么想法吗?
最初,这是我的有效代码:
data.loc[(data.ID.isin([10,45])) & (data.source.notnull()), 'ID'] = 50
但是我需要添加:
data.loc[(data.ID.isin([23,45])) & (data.source.notnull()), 'ID'] = 60
这对我来说是一个测试 DataFrame确实随着以下逻辑发生了变化:
import pandas as pd
data = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [10, 23, 32, 45],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
for x,y in data.iterrows():
if y['num_wings'] in [10,45]:
y['num_wings'] = 50
print(x,y)
这基本上就是我想要做的: 我可以使用此逻辑更改数据,但似乎并没有更改实际的DataFrame:
import pandas as pd
...
...
for x,y in data.iterrows():
if y['ID'] in [10,45]:
if y['source'] == 0:
if y['username'] == 'bill':
y['IDs'] = 50
print(x,y) #print the results to confirmed it worked, it did/
# however, dataframe is unchanged
这对我有用 DataFrame确实随着以下逻辑发生了变化:
import pandas as pd
data = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [10, 23, 32, 45],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
for x,y in data.iterrows():
if y['num_wings'] in [10,45]:
y['num_wings'] = 50
print(x,y)
我有信心可以进行所需的更改,但需要将其应用于DataFrame。
答案 0 :(得分:1)
为澄清起见,您正在尝试有条件地更新num_wings列的值吗?如果是这样,请继续。您需要使用.loc方法来更新数据框中的值。
import pandas as pd
data = pd.DataFrame({'num_legs': [2, 4, 8, 0],
'num_wings': [10, 23, 32, 45],
'num_specimen_seen': [10, 2, 1, 8]},
index=['falcon', 'dog', 'spider', 'fish'])
data.loc[data['num_wings'].isin([10,45]),'num_wings'] = 50
data
num_legs num_specimen_seen num_wings
falcon 2 10 50
dog 4 2 23
spider 8 1 32
fish 0 8 50
答案 1 :(得分:1)
该代码不起作用,原因是:({source)
根据数据类型,迭代器将返回副本而不是视图,并且对其进行写入将无效。
要对此进行撰写,您可以尝试查看at
是否有效,即
for x,y in data.iterrows():
if y['num_wings'] in [10,45]:
data.at[x, 'num_wings'] = 50
不建议仅在迭代时修改某些内容。但我认为您的情况应该可以。