随机使用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()
之类的东西,但是对于框架上的操作?
答案 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)
以下是使用assign
和add
的方式:
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