2015-08-24 31 views
1

我有一個循環結構在一個類中從另一個類中的數據幀中檢索行。行被逐一檢索,這意味着它們以系列形式返回。然後,我在該系列上執行多個操作,然後使用更改更新原始數據幀行。有時得到一個返回的數據框而不是一個系列

所有這些工作正常99%的時間,但在非常罕見的場合,而不是讓一個系列返回給我我得到一個數據幀。這對我來說沒有意義,因爲沒有重複的東西,所以我應該每次都有一個系列回到我身邊。這基本上是什麼即時通訊做:

class XYZ: 
    state_df = #create dataframe and populate it 

    def __init__(self): 
     pass 

    def get_state(self, rowname): 
     return self.state_df.loc[rowname].copy() 

    def update_state(self, new_symbol_state): 
     self.state_df.loc[new_symbol_state.name] = new_symbol_state 

class ABC: 
    def __init__(self): 
     pass 

    def process(): 
     xyz = MyClass.XYZ() 
     state_series = xyz.get_state(rowname) 
     # do stuff with the dataframe row which should be a series 
     # ie: state_series. Then update the original dataframe row 
     xyz.update_state(state_series) 

所以就像我說的,我得到一個系列退給我99%的時間,我就可以執行一些操作,然後我送它回到原來的數據幀和所有很好。然而,我現在一次又一次得到一個數據框,而不是一個沒有意義的系列。即使我打印出數據幀,它也會顯示它只有一行(即:不重複),因此它應該是一個Series?

我需要一種方法來確保在撥打state_series = xyz.get_state(rowname)時,我總是得到一個系列給我。有沒有辦法確保我總能得到一系列回饋給我的東西?或者至少如果我得到一個數據幀返回給我只有1行,那麼我如何將它更改爲一個系列。

回答

1

df.loc[rowname]將返回一個DataFrame,如果rowname是一個列表,而不是一個單一的元素。示例 -

In [14]: df 
Out[14]: 
    A B 
0 1 3 
1 2 4 
2 3 5 
3 4 5 

In [15]: df.loc[0] 
Out[15]: 
A 1 
B 3 
Name: 0, dtype: int64 

In [16]: type(df.loc[0]) 
Out[16]: pandas.core.series.Series 

In [17]: df.loc[[0]] 
Out[17]: 
    A B 
0 1 3 

In [18]: type(df.loc[[0]]) 
Out[18]: pandas.core.frame.DataFrame 

因爲,我們看不到的地方rowname是從,我guessng這可能是問題來了,你可以檢查一下,爲什麼有時rowname會來作爲一個列表,而不是一個單一的值。

+0

謝謝。我還沒有弄清楚問題出在哪裏。但你的建議可能是正確的,...我只需要弄清楚這是怎麼發生的。 – darkpool

相關問題