2017-02-10 46 views
3

奇怪的問題我似乎無法將我的頭圍繞起來,我知道還有更好的方法來看待它,我只是卡住了。我需要根據類型獲取這些數據塊。 1到4在一個集合中,所以我想要例如0到8行,然後是9。每一組都將作爲數據庫中的條目輸入。如何使用Python基於動態條件分隔數據行的行數

 num   date type  signed 
0 294981 2015-05-01  1  None 
1 299888 2015-05-22  2 2015-05-28 
2 299891 2015-05-22  2 2015-05-28 
3 316150 2015-07-14  3 2015-07-23 
4 336930 2015-10-13  3 2015-10-16 
5 357536 2015-12-29  3 2015-12-29 
6 379224 2016-03-14  3 2016-03-18 
7 403862 2016-06-10  3 2016-06-10 
8 414282 2016-07-26  4 2016-08-03 
9 439184 2016-11-10  1 2016-11-14 
10 448972 2016-12-12  2 2016-12-14 
11 464306 2017-02-02  3 2017-02-06 

事情是該數據是不固定的,有套與可能有10行3型的,沒有爲1或4的的。所以,如果我有以下:

 num   date type  signed 
0 294981 2015-05-01  2  None 
1 299888 2015-05-22  2 2015-05-28 
2 299891 2015-05-22  2 2015-05-28 
3 316150 2015-07-14  3 2015-07-23 
4 336930 2015-10-13  3 2015-10-16 
5 357536 2015-12-29  3 2015-12-29 
6 379224 2016-03-14  1 2016-03-18 
7 403862 2016-06-10  3 2016-06-10 
8 414282 2016-07-26  3 2016-08-03 
9 439184 2016-11-10  4 2016-11-14 
10 448972 2016-12-12  1 2016-12-14 
11 464306 2017-02-02  2 2017-02-06 

我需要出去:

 num   date type  signed 
0 294981 2015-05-01  2  None 
1 299888 2015-05-22  2 2015-05-28 
2 299891 2015-05-22  2 2015-05-28 
3 316150 2015-07-14  3 2015-07-23 
4 336930 2015-10-13  3 2015-10-16 
5 357536 2015-12-29  3 2015-12-29 

    num   date type  signed 
6 379224 2016-03-14  1 2016-03-18 
7 403862 2016-06-10  3 2016-06-10 
8 414282 2016-07-26  3 2016-08-03 
9 439184 2016-11-10  4 2016-11-14 

    num   date type  signed 
10 448972 2016-12-12  1 2016-12-14 
11 464306 2017-02-02  2 2017-02-06 

不幸的是有沒有其他的方式來組這一數據比笨類型值等。我可以勝任熊貓,無法找到辦法去做,我也不會想到其他任何東西都可以使用,而不告訴Python 究竟是哪些值可以抓取,哪些當然我不知道沒有看數據。

幫助非常感謝! (順便說一下,我在標題中說'動態條件',因爲類型列的值不是1-4,或者2-4或者1-3,或者我可以設置的任何東西,它會根據當時生成的數據而變化)

+0

你能更清楚地說出你的問題嗎?我已經閱讀了三次,而且我仍然不確定你要求什麼。 –

+0

@ jimmy-c對此我很抱歉!我加了一點,所以你可以看到數據需要如何分組。它需要分成1-4組(不改變日期順序)。一旦我掌握了這些數據,我就會把第一個,最後一個和中間的數值作爲別的。我需要顯示1-4組的開始,結束和中間階段。我希望這是有道理的,這使我瘋狂。 –

回答

2

假設你要開始一個組結束後的類型爲低則上一行的類型,這個代碼應工作:

class Group(): 
    start = 0 
    last_type = 0 
    def four_group(self,x): 
     if x < Group.last_type: 
      Group.start +=1 
     groupNum = Group.start 
     Group.last_type = x 
     return groupNum 


df = pd.read_csv("chart.csv") 
zzz = Group() 
df['TempGroup'] = df.type.apply(lambda x:zzz.four_group(x)) 

使用你的第二個數據幀:

 num   date type  signed 
0 294981 2015-05-01  2  None 
1 299888 2015-05-22  2 2015-05-28 
2 299891 2015-05-22  2 2015-05-28 
3 316150 2015-07-14  3 2015-07-23 
4 336930 2015-10-13  3 2015-10-16 
5 357536 2015-12-29  3 2015-12-29 
6 379224 2016-03-14  1 2016-03-18 
7 403862 2016-06-10  3 2016-06-10 
8 414282 2016-07-26  3 2016-08-03 
9 439184 2016-11-10  4 2016-11-14 
10 448972 2016-12-12  1 2016-12-14 
11 464306 2017-02-02  2 2017-02-06 

代碼返回:

 num  date type  signed TempGroup 
0 294981 5/1/2015  2  None   0 
1 299888 5/22/2015  2 5/28/2015   0 
2 299891 5/22/2015  2 5/28/2015   0 
3 316150 7/14/2015  3 7/23/2015   0 
4 336930 10/13/2015  3 10/16/2015   0 
5 357536 12/29/2015  3 12/29/2015   0 
6 379224 3/14/2016  1 3/18/2016   1 
7 403862 6/10/2016  3 6/10/2016   1 
8 414282 7/26/2016  3 8/3/2016   1 
9 439184 11/10/2016  4 11/14/2016   1 
10 448972 12/12/2016  1 12/14/2016   2 
11 464306 2/2/2017  2 2/6/2017   2 

然後,您可以拆分基於TempGroup的數據幀,然後dro p TempGroup列。

編輯:混合的數據框

0

作爲一種觀察,我看到你的「類型」看起來像是按年分組。如果是這樣,這樣的事情可能會爲你工作: getYear = lambda x: x.year data.year = data.date.apply(getYear) myGroup = data.groupby(year)

+0

如果看起來像這樣拍攝很抱歉,這絕對是這個樣本的巧合。所有1-4套跨越多年。 –

2

我假設你將能夠分辨套,因爲下一個的類型將小於較早的企業之一。

您可以添加一個額外的臨時列,以添加分離的數據幀的序列號。類似這樣的:

def separate_df(t): 
    res = pd.Series() 
    previous_df_no = 0 
    for (index, value) in t.iteritems(): 
     if index==0: 
      res.set_value(index,0) 
     else: 
      if value<t.loc[index-1]: 
       previous_df_no += 1 
      res.set_value(index,previous_df_no) 
    return res 
df['temp'] = separate_df(df.type) 

然後,您可以使用序列號分辨每行所屬的數據幀,並在分離後刪除臨時行。

+0

Priya非常感謝!我決定採用基於課堂的答案,但仍使用類似的邏輯。 –