pandas DataFrame中列的缩写表示法

时间:2017-06-01 15:41:28

标签: python pandas dataframe calculated-columns

随机使用DataFrame:

df = pd.DataFrame(np.random.rand(3, 2), columns=['a', 'b'])

Pandas允许以两种方式定义新列:

df['c'] = df.a + df.b
df['c'] = df['a'] + df['b']

随着DataFrame名称变长,此表示法的可读性降低。

然后是query函数:

df.query('a > b')

返回与条件匹配的df切片。

有没有办法运行DataFrame.query()之类的东西,但是对于框架上的操作?

3 个答案:

答案 0 :(得分:3)

函数DataFrame.eval()正是这样做的:

df.eval('c = a + b')

无警告任务:

df.eval('c = a + b', inplace=True)

更一般地说,pandas.eval()

  

支持以下算术运算:+, - ,*,/,**,%,   //(仅限python引擎)以及以下布尔操作:|   (或),& (和),和〜(不)。此外,'pandas'解析器允许   使用和,或,而不是使用相同的语义   相应的按位运算符。

Pandas文档说eval仅支持Python expression statements(例如a == b),但是pandas默默支持abs(a - b)和其他语句。其余的抛出错误。例如:

df.eval('del(a)')

返回NotImplementedError: 'Delete' nodes are not implemented

答案 1 :(得分:1)

以下是使用assignadd的方式:

df.assign(c=df.a.add(df.b))

          a         b         c
0  0.086468  0.978044  1.064512
1  0.270727  0.789762  1.060489
2  0.150097  0.662430  0.812527

注意:assign会创建数据框的副本,因此您不会扭曲原始数据。您需要重新分配到另一个变量或返回到df。

答案 2 :(得分:1)

考虑名为my_obnoxiously_long_dataframe_name

的数据框
np.random.seed([3,1415])
my_obnoxiously_long_dataframe_name = pd.DataFrame(
    np.random.randint(10, size=(10, 10)),
    columns=list('ABCDEFGHIJ')
)

my_obnoxiously_long_dataframe_name

   A  B  C  D  E  F  G  H  I  J
0  0  2  7  3  8  7  0  6  8  6
1  0  2  0  4  9  7  3  2  4  3
2  3  6  7  7  4  5  3  7  5  9
3  8  7  6  4  7  6  2  6  6  5
4  2  8  7  5  8  4  7  6  1  5
5  2  8  2  4  7  6  9  4  2  4
6  6  3  8  3  9  8  0  4  3  0
7  4  1  5  8  6  0  8  7  4  6
8  3  5  8  5  1  5  1  4  3  9
9  5  5  7  0  3  2  5  8  8  9

如果您想要更清晰的代码,请创建一个较小的临时变量名

d_ = my_obnoxiously_long_dataframe_name

d_['K'] = abs(d_.J - d_.D)
d_['L'] = d_.A + d_.B

del d_

my_obnoxiously_long_dataframe_name

   A  B  C  D  E  F  G  H  I  J  K   L
0  0  2  7  3  8  7  0  6  8  6  3   2
1  0  2  0  4  9  7  3  2  4  3  1   2
2  3  6  7  7  4  5  3  7  5  9  2   9
3  8  7  6  4  7  6  2  6  6  5  1  15
4  2  8  7  5  8  4  7  6  1  5  0  10
5  2  8  2  4  7  6  9  4  2  4  0  10
6  6  3  8  3  9  8  0  4  3  0  3   9
7  4  1  5  8  6  0  8  7  4  6  2   5
8  3  5  8  5  1  5  1  4  3  9  4   8
9  5  5  7  0  3  2  5  8  8  9  9  10