迭代pandas中的数据帧行并更改值

时间:2014-07-18 01:01:12

标签: python pandas

我的问题涉及迭代数据帧的行,并在每一行上根据不同数据帧中的信息设置字段。对不起,如果这是一个基本问题,但我已经通过论坛没有成功。

我有两个名为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
...

编辑:感谢您的出色回复,这对于手头的问题非常有用。

2 个答案:

答案 0 :(得分:1)

您可以使用mergegroupby执行此操作。如下所示,我修改了一些数据以获得列中的匹配值,以更好地显示结果。

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)