如何在pandas Dataframe中自引用列?

时间:2015-01-23 00:48:40

标签: python pandas scipy

在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]

3 个答案:

答案 0 :(得分:4)

现在,您可以根据需要使用queryassign

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中引用像selfthis这样的父对象,但也许另一种方法可以做到你想要的更多可能被认为是DRY的{{{ 1}}。

where()

答案 2 :(得分:1)

在最新版本的pandas中,.where()也接受可调用的!

http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.where.html?highlight=where#pandas.DataFrame.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.indexDataFrame.columns中的项目默认位于query命名空间中,这意味着您无需引用自己。