微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 使用List Comprehension迭代Pandas数据帧

我可以用另一种方式解决但是,我有兴趣理解为什么尝试使用列表推导迭代pandas DataFrame不起作用. (这里是一个数据帧)

def func(a,seed1,seed2):
    for i in range(0,3):
        # Sum of squares. Results in a series containing 'date' and 'num' 
        sorted1 = ((a-seed1)**2).sum(1)
        sorted2 = ((a-seed2)**2).sum(1)

        # This makes a list out of the dataframe. 
        a = [a.ix[i] for i in a.index if sorted1[i]<sorted2[i]]
        b = [a.ix[i] for i in a.index if sorted1[i]>=sorted2[i]]
        # The above line throws the exception:
        # TypeError: 'builtin_function_or_method' object is not iterable

        # Throw it back into a dataframe...

        a = pd.DataFrame(a,columns=['A','B','C'])
        b = pd.DataFrame(b,columns=['A','B','C'])

        # Update the seed.
        seed1 = a.mean()
        seed2 = b.mean()

        print a.head()
        print "I'm computing."

解决方法:

问题出在第一行之后,a不再是DataFrame:

a = [a.ix[i] for i in a.index if sorted1[i]<sorted2[i]]
b = [a.ix[i] for i in a.index if sorted1[i]>=sorted2[i]]

它是一个列表,因此没有索引属性(因此错误).

一个python技巧是在一行中执行此操作(同时定义它们),即:

a, b = [a.ix[i] for ...], [a.ix[i] for ...]

也许更好的选择是在这里使用不同的变量名称(例如df).

就像你说的,有更好的方法在熊猫中做到这一点,显而易见的是使用一个面具:

msk = sorted1 < sorted2

seed1 = df[msk].mean()
seed2 = df[~msk].mean()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐