如何在熊猫中使用series.map()或series.apply()将函数正确地应用于系列

时间:2019-07-23 15:40:08

标签: python pandas

我正在尝试使用pandas将预定义函数(myfunc)应用于DataFrame中的新系列。该函数将检查旧列(每行)中每个索引中的值是否大于前一个索引,如果是则返回1,否则返回0。

我还尝试了series.apply()函数,并且得到:在新创建的列中的所有行中。

def myfunc(x):
    for i in range(0,86):
        if x.iloc[i + 1] > x.iloc[i]:
            yield 1
        else:
            yield 0

df2['Higher Inflation - US'] = df2['US'].map(myfunc)
print(df2)

我希望在新列中看到1和0。当我在函数中使用'print'而不是'yield'时,我得到了想要的结果,但是我想要做的就是将此函数应用于多个序列。

1 个答案:

答案 0 :(得分:0)

您可以使用shift函数比较前几行中的值:

import pandas as pd
df2 = pd.DataFrame(
{
    'US':[1,2,3,4,5,6,7,8,9,8,7,6,5,4,3,2,1]
})

def myfunc1(x):
    if x:
        return 1
    else:
        return 0

df2['Higher Inflation - US'] = (df2['US']>df2['US'].shift()).map(myfunc1)
df2

会返回:

    US  Higher Inflation - US
0   1   0
1   2   1
2   3   1
3   4   1
4   5   1
5   6   1
6   7   1
7   8   1
8   9   1
9   8   0
10  7   0
11  6   0
12  5   0
13  4   0
14  3   0
15  2   0
16  1   0

函数非常简单,最好用lambda代替:

(df2['US']>=df2['US'].shift()).apply(lambda x: 1 if x else 0)

结果相同