在pandas中遍历数据框的行并修改值
我有个问题,想知道怎么遍历一个数据框的每一行,并根据另一个数据框的信息来设置某个字段。抱歉如果这个问题听起来很基础,但我在论坛上找了很久也没找到答案。
我有两个数据框,分别叫做 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