熊猫iterrows()

时间:2019-04-04 20:26:27

标签: python python-3.x pandas

我正在使用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。

2 个答案:

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

不建议仅在迭代时修改某些内容。但我认为您的情况应该可以。