将pandas DataFrame / Panel .apply()与索引/列信息一起使用

时间:2016-06-24 16:22:03

标签: python pandas apply

我有一个像这样的pandas DataFrame:

           2016      2017      2018      2019      2020
1  0.014199  0.020776  0.016393  0.010112  0.013346
2  0.025220  0.024088  0.035357  0.026878  0.031841
3  0.016345  0.014117  0.017157  0.019280  0.017307
4  0.021467  0.020389  0.027269  0.027727  0.025750
5  0.012459  0.004377  0.015435  0.023725  0.031228

一个看起来像这样的函数:

def f(a,b):
   return a+b

我正在寻找一种快速(即避免循环)计算数据帧中每个元素的f的方法,其中a是条目,b是其列名(或索引,如果也是作品)。

输出将如下所示:

    2016             2017
1   2016.014199      2017.020776 ...
2   2016.025220      2017.024088 ...

我一直在尝试.apply()功能,但还没有找到如何使它工作。你有什么提示吗?

KR,理查德

2 个答案:

答案 0 :(得分:3)

试试这个:

In [138]: df.apply(lambda x: int(x.name) + x)
Out[138]:
          2016         2017         2018         2019         2020
1  2016.014199  2017.020776  2018.016393  2019.010112  2020.013346
2  2016.025220  2017.024088  2018.035357  2019.026878  2020.031841
3  2016.016345  2017.014117  2018.017157  2019.019280  2020.017307
4  2016.021467  2017.020389  2018.027269  2019.027727  2020.025750
5  2016.012459  2017.004377  2018.015435  2019.023725  2020.031228

注意:@ root的解决方案要快得多:

In [150]: df = pd.concat([df] * 10**5, ignore_index=False)

In [151]: df.shape
Out[151]: (500000, 5)

In [152]: %timeit df.apply(lambda x: int(x.name) + x)
10 loops, best of 3: 40.7 ms per loop

In [153]: %timeit df.add(df.columns.map(int))
100 loops, best of 3: 7.95 ms per loop

答案 1 :(得分:3)

假设您的列名是整数,您可以使用add列值:

df = df.add(df.columns.values)

如果列名是字符串,请在使用map时使用add将列名转换为整数:

df = df.add(df.columns.map(int))