在Python的Pandas中,我正在使用数据框:
drinks = pandas.read_csv(data_url)
其中data_url是CSV文件的字符串URL
为所有"轻度饮酒者索引框架"轻饮者由1杯饮料构成,以下是:
drinks.light_drinker[drinks.light_drinker == 1]
是否有一种更像DRY的方式来自我引用"父母"?即类似的东西:
drinks.light_drinker[self == 1]
答案 0 :(得分:4)
drinks.query('light_drinker == 1')
或改变df:
df.assign(strong_drinker = lambda x: x.light_drinker + 100)
旧答案
目前还没有,但正在讨论对您的想法的改进here。对于简单的情况,where
可能就足够了。新API可能如下所示:
df.set(new_column=lambda self: self.light_drinker*2)
答案 1 :(得分:1)
我不知道如何在Pandas中引用像self
或this
这样的父对象,但也许另一种方法可以做到你想要的更多可能被认为是DRY的{{{ 1}}。
where()
答案 2 :(得分:1)
在最新版本的pandas中,.where()
也接受可调用的!
所以,现在可以实现以下目标:
drinks.light_drinker.where(lambda x: x == 1)
在方法链中特别有用。但是,这将只返回Series(而不是基于light_drinker
列中的值过滤的DataFrame)。这与你的问题是一致的,但我会详细说明另一个案例。
要获取已过滤的DataFrame,请使用:
drinks.where(lambda x: x.light_drinker == 1)
请注意,这将保留self的形状(意味着您将拥有所有条目都为NaN
的行,因为该索引处的light_drinker
值的条件失败)。
如果您不想保留DataFrame的形状(即您希望删除NaN
行),请使用:
drinks.query('light_drinker == 1')
请注意,DataFrame.index
和DataFrame.columns
中的项目默认位于query
命名空间中,这意味着您无需引用自己。