如何将函数应用于pandas中的数据透视表的每一列?

时间:2015-10-18 18:50:41

标签: python pandas dataframe

代码:

df = pd.read_csv("example.csv", parse_dates=['ds'])
df2 = df.set_index(['ds', 'city']).unstack('city')
rm = pd.rolling_mean(df2, 3)
sd = pd.rolling_std(df2,3)

df2输出:

enter image description here

我想要的:我希望能够看到每个城市,对于每个日期,该数字是否大于该城市预订平均值的1 std dev。对于前伪代码:

for each (city column) 
for each (date)
see whether the (number of bookings) - (same date and city rolling mean) > (same date and city std dev)
print that date and city and number of bookings

问题是:我在试图弄清楚如何从每个数据框中访问我需要的数据时遇到了麻烦。括号中的伪代码部分是我需要帮助解决的问题。

我尝试了什么:

DF2 [ '城市'] 列表(DF2)

两者都给我错误。

DF2 [1:2]

拼接有效,但我觉得这不是访问它的最佳方法。

1 个答案:

答案 0 :(得分:1)

您应该使用DataFrame API的apply功能。演示如下:

import pandas as pd
df = pd.DataFrame({'A': [1,2,3,4,5]; 'B': [1,2,3,4,5]})
df['C'] = df.apply(lambda row: row['A']*row['B'], axis=1)

输出:

>>> df
   A  B   C
0  1  1   1
1  2  2   4
2  3  3   9
3  4  4  16
4  5  5  25

更具体地说是你的情况:

  1. 你必须预先计算:“同一日期和城市滚动意味着”,“同一日期和城市标准开发”。您可以使用groupby功能,它允许通过城市日期汇总数据,之后您可以计算std dev和mean。

  2. 将std dev和mean放在你的表中,使用字典:some_dict = {('city', 'date'):[std_dev, mean], ..}。要将数据放入数据框,请使用 apply 功能。

  3. 您可以通过 apply 功能运行检查所需的所有数据。