在pandas中遍历数据框的行并修改值

1 投票
2 回答
1525 浏览
提问于 2025-04-18 13:47

我有个问题,想知道怎么遍历一个数据框的每一行,并根据另一个数据框的信息来设置某个字段。抱歉如果这个问题听起来很基础,但我在论坛上找了很久也没找到答案。

我有两个数据框,分别叫做 sample 和 lvlslice。我的 sample 数据框的索引没有名字(好像在随机挑选一些条目时丢失了)。我想对 sample 中的每一行,计算 lvlslice 中与我的索引匹配的 fbid 的 amount 字段的总和,然后把结果放到一个新的列 new_col 里。

我可以用一些非常笨拙的 for 循环来做到这一点,还得把索引做成列表等等。这看起来像是简单的数据处理,我主要的问题是,怎么遍历 sample 数据框的行,然后根据行的内容来设置值?

任何帮助都非常感谢。我特别想知道这种操作的正确方法,而不仅仅是如何计算总和。

print(sample)

         purchase   new_col
43022    True       0
3423     True       0
43534    True       0

print(lvlslice)

                             fbid   other_stuff  amount
timestamp               
2014-01-03 00:00:10.328000   3424   stuff        320
2014-01-03 00:00:21.419000   5557   stuff        360
2014-01-03 00:00:22.667000   3424   stuff        7000
...

编辑:感谢你的精彩回复,这对我来说非常有用,超出了我当前的问题。

2 个回答

1

这是我第一次发帖,如果代码格式看起来有点奇怪,抱歉!

我觉得这正是你想要的,但这样做很麻烦,也很耗资源。对于这种常见的需求,几乎总是有更优雅的方法可以直接用pandas来实现。

import pandas as pd

sample = pd.DataFrame({"purchase": True, "new_col": 0},index=[43022, 3424, 43534])
lvlslice = pd.DataFrame({'fbid': [3424, 43534, 3424], 'other_stuff': 'stuff','amount': [320, 360, 7000]})
sample['total'] = 0

for sampleindex in sample.index:
    for lvlsliceindex in lvlslice.index:
    amount = lvlslice.ix[lvlsliceindex]['amount']
    if sampleindex == lvlslice.ix[lvlsliceindex]['fbid']:
        sample.loc[sampleindex,'total'] += amount

print sample['total']

输出结果:

43022       0
3424     7320
43534     360
Name: total, dtype: int64

但别这样做,使用bananafish的代码。

而不是:

print df.groupby('fbid')['amount'].sum()

你可以用以下方式得到相同的结果:

df.groupby('fbid').agg('sum')['amount']

如果你想保留在样本中总数为零的行,可以这样合并:

df = pd.merge(lvlslice, sample, left_on='fbid', right_index=True,how='outer').fillna(0)
1

你可以使用合并分组来实现这个功能。下面我对你的数据做了一些修改,以便在列中得到匹配的值,这样结果会更清晰。

import pandas as pd

sample = pd.DataFrame({"purchase": True, "new_col": 0},
                      index=[43022, 3424, 43534])

lvlslice = pd.DataFrame({'fbid': [3424, 43534, 3424], 'other_stuff': 'stuff',
                         'amount': [320, 360, 7000]})

df = pd.merge(lvlslice, sample, left_on='fbid', right_index=True)

print df.groupby('fbid')['amount'].sum()

这段代码会输出:

fbid
3424     7320
43534     360
Name: amount, dtype: int64

撰写回答