2017-06-01 72 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

謝謝!現在我認爲熊貓包代碼必須包含已實現(並未實現)的節點。 –