Pandas:在Dataframe子集上使用iterrows

8

如何对DataFrame的子集进行iterrows遍历是最好的方法?

让我们以以下简单示例为例:

import pandas as pd

df = pd.DataFrame({
  'Product': list('AAAABBAA'),
  'Quantity': [5,2,5,10,1,5,2,3],
  'Start' : [
      DT.datetime(2013,1,1,9,0),
      DT.datetime(2013,1,1,8,5),
      DT.datetime(2013,2,5,14,0),
      DT.datetime(2013,2,5,16,0),
      DT.datetime(2013,2,8,20,0),                                      
      DT.datetime(2013,2,8,16,50),
      DT.datetime(2013,2,8,7,0),
      DT.datetime(2013,7,4,8,0)]})

df = df.set_index(['Start'])

现在我想使用itterrows函数修改这个DataFrame的子集,例如:
for i, row_i in df[df.Product == 'A'].iterrows():
    row_i['Product'] = 'A1' # actually a more complex calculation

然而,这些更改并不会被保留。

除了使用索引“i”进行手动查找之外,有没有其他可能使原始数据框上的更改持续存在的方法?


你是否正在尝试从不同的列中获取参数并将函数应用于每一行?这个问题已经在这里得到了解答:https://dev59.com/fGQo5IYBdhLWcg3wDb0J。 - dmvianna
2个回答

2

为什么需要使用iterrows()呢?我认为在pandas(或numpy)中使用向量化操作总是更可取的:

df.ix[df['Product'] == 'A', "Product"] = 'A1'

4
感谢您的评论。这只是一个简单的例子,我实际的用例更为复杂,我需要在其中使用iterrows。 - Andy
@Andy:那么你需要在你的问题中明确表达。 - smci

0

我想到的最好的方法是生成一个新的向量,其中包含所需的结果,您可以随意循环,然后将其重新分配回列

#make a copy of the column
P = df.Product.copy()
#do the operation or loop if you really must
P[ P=="A" ] = "A1"
#reassign to original df
df["Product"] = P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接