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
假设我有一个包含列 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