2017-06-01 44 views
1

采取随机数据帧两种方式:较短的符号来表示列

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

熊猫允许定义新的列:

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

由于数据框名称变长,这个符号变得不太可读。

然后还有的query功能:

df.query('a > b') 

它返回符合条件的df的切片。

有没有办法像DataFrame.query()那样运行一些东西,但对于框架上的操作?

回答

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 

注:分配创建您的数据帧的副本,所以你是不是扭曲的原始数据。您需要重新分配给不同的变量或回到df。

3

功能DataFrame.eval()正是这样做的:

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

而且无警告的任务:

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

更一般地,pandas.eval()

以下算术运算的支持:+, - ,*,/,**,%, //(仅限python引擎)沿着wi th以下布尔操作:| (或),&(和)和〜(不)。此外,'熊猫'分析器允许使用和,或者与和相应的按位运算符相同的语义。

熊猫文档说eval仅支持Python expression statements(例如,a == b),但大熊猫默默支持abs(a - b)也许其他声明。其余的抛出一个错误。例如:

df.eval('del(a)') 

返回NotImplementedError: 'Delete' nodes are not implemented

+2

我之前批评是不正确的。你可以通过一个'\ n'分隔的公式字符串。另外,我强调的“浮动”问题与我使用'abs'有关。你应该包含诸如'c = a + b \ nd = c ** 2'之类的东西。请注意,您可以参考之前在同一个字符串中创建的列。 – piRSquared

+0

我也会包含一些输出。对我而言,看到输出结果是令人满意的。 – piRSquared

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 
+0

您在未经编辑的答案中使用了'eval()'中的'abs'。你有'pandas.eval()'支持的其他未记录语句的列表吗? –

+1

@AntonTarasenko我没有一个方便的列表。但是我知道像'max','min','log'等等这样的东西可以工作......注意'engine'参数默认为'numexpr' *'engine:string或None,默认'numexpr',{ 'python','numexpr'}'*您可以在这里找到更多的信息**(https://pypi.python.org/pypi/numexpr) – piRSquared

+0

谢谢!现在我认为熊猫包代码必须包含已实现(并未实现)的节点。 –