Pandas:使用字典(包括运算符)到数据框中的 return 列子集

Pandas: using dict (including operators) to return column subset from dataframe

假设我有一个包含列 a, b, c, d, e 和字典 {"A": "a", "B": "b", "E": "e"}

的数据框

a) 我如何使用这本词典来 return 一个只有这 3 列(重命名为大写字母)的新数据框(相同索引)?

b) 或者,有没有办法删除原始数据框中 not 列在字典中的任何列,并基本上将原始数据框减少到选择? (重命名列?)

让我们进一步说我有字典 {"A": "a", "Diff": "b - c", "Sum": "d + e"} 引用我的数据框中的列,但也包括运算符 (-, +)。

c) 有没有办法 return 一个新的数据框(相同的索引),其中有 3 个新列,其中的数据来自操作员描述的我的原始数据框 "aggregated"?

感谢您的帮助

关于问题 a 和 b,以下将有效:

import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.randn(4, 5), columns=list('abcde'))

          a         b         c         d         e
0  0.653701 -1.267756  0.680395  0.997065  1.389126
1 -1.598463  2.595352  0.983189 -0.130996  0.605120
2  0.631091 -1.293486  0.095808 -0.474806 -0.353356
3  1.867020  2.164540  0.021103  1.810129  1.114983

d = {"A": "a", "B": "b", "E": "e"}

然后,对于 Python 2,

df[d.values()].rename(columns={v: k for k, v in d.items()})

并且,对于 Python 3.x(参见 MaxU 的评论)

df.loc[:, d.values()].rename(columns={v: k for k, v in d.items()})

给你想要的输出:

          A         B         E
0  0.653701 -1.267756  1.389126
1 -1.598463  2.595352  0.605120
2  0.631091 -1.293486 -0.353356
3  1.867020  2.164540  1.114983

您可以使用 eval-- 不是同名的 Python 函数,而是 DataFrame method.

In [50]: df = pd.DataFrame(np.arange(15).reshape((3,5)), columns=list("abcde"))

In [51]: df
Out[51]: 
    a   b   c   d   e
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14

In [52]: d = {"A": "a", "B": "b", "C": "c"}

In [53]: d2 = {"A": "a", "Diff": "b - c", "Sum": "d + e"}

在个别系列上使用 DataFrame 构造函数而不是 pd.concat

In [87]: pd.DataFrame({k: df.eval(v) for k,v in d.items()})
Out[87]: 
    A   B   C
0   0   1   2
1   5   6   7
2  10  11  12

In [88]: pd.DataFrame({k: df.eval(v) for k,v in d2.items()})
Out[88]: 
    A  Diff  Sum
0   0    -1    7
1   5    -1   17
2  10    -1   27

我用了 :

In [145]: d2 = {"A": "a", "Diff": "b - c", "Sum": "d + e"}

In [146]: df
Out[146]:
    a   b   c   d   e
0   0   1   2   3   4
1   5   6   7   8   9
2  10  11  12  13  14

多行查询允许我们使用 DataFrame.eval():

添加多个列
In [147]: df.eval('\n'.join(['{} = {}'.format(k,v) for k,v in d2.items()]), inplace=False)
Out[147]:
    a   b   c   d   e   A  Diff  Sum
0   0   1   2   3   4   0    -1    7
1   5   6   7   8   9   5    -1   17
2  10  11  12  13  14  10    -1   27

注意:它仅在新列出现在新行的情况下有效

解释:

In [148]: print('\n'.join(['{} = {}'.format(k,v) for k,v in d2.items()]))
A = a
Diff = b - c
Sum = d + e

您甚至可以在进一步计算中使用新列(注意 "new" 列):

In [152]: d3 = {"Diff": "b - c", "Sum": "d + e", "new": "Sum - Diff"}

In [153]: df.eval('\n'.join(['{} = {}'.format(k,v) for k,v in d3.items()]), inplace=False)
Out[153]:
    a   b   c   d   e  Diff  Sum  new
0   0   1   2   3   4    -1    7    8
1   5   6   7   8   9    -1   17   18
2  10  11  12  13  14    -1   27   28