我的问题涉及迭代数据帧的行,并在每一行上根据不同数据帧中的信息设置字段。对不起,如果这是一个基本问题,但我已经通过论坛没有成功。
我有两个名为sample和lvlslice的数据帧。我的样本上没有索引的名称(似乎在随机挑选一些条目的混乱中丢失了)。对于样本中的每一行,我试图将lvlslice条目的金额字段与fbid匹配我的索引,并将结果放在我的new_col中。
我可以用一些可怕的笨拙for循环来做这个,制作列表的索引等等。这看起来像简单的数据操作,我的主要问题是我如何迭代我的示例数据框的循环,然后设置基于行内容的值?
任何帮助将不胜感激。我特别感兴趣的是这种操作的正确方法是什么,而不仅仅是如何获得我的总和。
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
...
编辑:感谢您的出色回复,这对于手头的问题非常有用。
答案 0 :(得分:1)
您可以使用merge和groupby执行此操作。如下所示,我修改了一些数据以获得列中的匹配值,以更好地显示结果。
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
答案 1 :(得分: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]})
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)