2017-08-04 131 views
3

您會在問題結尾找到具有可重複輸入的片段以及期望輸出的示例。識別並計算熊貓數據框中的獨特模式

挑戰:

我有這樣一個數據幀:

enter image description here

數據框有這樣的1和0的模式兩列:

enter image description here

或者這個:

enter image description here

列的數量會有所不同,模式的長度也會不同。 但是,數據框中的唯一數字將爲0或1.

我想識別這些模式,計算它們的每次出現次數,然後構建包含結果的數據幀。爲了簡化整個事情,我想專注於,並忽略。在這種特定情況下所需的輸出將是:在column_A

enter image description here

我想的程序,以確定,作爲一個例子,圖案[1,1,1]發生兩次,而不是完全在column_B中。請注意,我已將這些模式的總和用作數據框中的索引。

重現輸入:

import pandas as pd 
df = pd.DataFrame({'column_A':[1,1,1,0,0,0,1,0,0,1,1,1], 
        'column_B':[1,1,1,1,1,0,0,0,1,1,0,0]}) 

colnames = list(df) 
df[colnames] = df[colnames].apply(pd.to_numeric) 
datelist = pd.date_range(pd.datetime.today().strftime('%Y-%m-%d'), periods=len(df)).tolist() 
df['dates'] = datelist 
df = df.set_index(['dates']) 
print(df) 

所需的輸出:

df2 = pd.DataFrame({'pattern':[5,3,2,1], 
       'column_A':[0,2,0,1], 
       'column_B':[1,0,1,0]}) 
df2 = df2.set_index(['pattern']) 
print(df2) 

我嘗試至今:

我一直在努力尋找解決方案,其中包括嵌套for循環,我計算runnin g每次觀測值等於零時重置的總和。它還包括諸如df.apply(lambda x: x.value_counts())之類的功能。但至少可以說,至少不是100%正確。

謝謝你的任何其他建議!

+1

也許這個是類似的:https:// stackoverflow。com/questions/42555031/pandas-find-sequence-or-pattern-in-column – Moritz

回答

2

這裏是我的嘗試:

def fun(ser): 
    ser = ser.dropna() 
    ser = ser.diff().fillna(ser) 
    return ser.value_counts() 


df.cumsum().where((df == 1) & (df != df.shift(-1))).apply(fun) 
Out: 
    column_A column_B 
1.0  1.0  NaN 
2.0  NaN  1.0 
3.0  2.0  NaN 
5.0  NaN  1.0 

第一部分(df.cumsum().where((df == 1) & (df != df.shift(-1))))產生的累計總和:

  column_A column_B 
dates       
2017-08-04  NaN  NaN 
2017-08-05  NaN  NaN 
2017-08-06  3.0  NaN 
2017-08-07  NaN  NaN 
2017-08-08  NaN  5.0 
2017-08-09  NaN  NaN 
2017-08-10  4.0  NaN 
2017-08-11  NaN  NaN 
2017-08-12  NaN  NaN 
2017-08-13  NaN  7.0 
2017-08-14  NaN  NaN 
2017-08-15  7.0  NaN 

所以,如果我們忽略了NaN,並且採取差異列表,我們可以有值。這就是函數的作用:它會拋出NaN,然後​​取出差異,所以它不再是累計和。它最終返回值計數。

+1

感謝您找到時間來解釋解決方案中的細節! – vestland