2013-09-24 59 views
1

我有一個數據框,df,有兩列:ID和日期。它記錄不同日期的ID的事件。這兩個字段都不是唯一的,但行通過組合是唯一的(沒有ID在同一日期有多個記錄)。熊貓數據框,應用函數,返回索引

我有以下功能在任何將來的日期添加新列來確定,在給定的記錄/日期,是否(TRUE/FALSE)的ID有另一個記錄:

def f(df): 
    count = pd.Series(np.arange(1, len(df)+1), index=df["date"]) 
    day = count.index.shift(0, freq="D") 
    next18month = count.index.shift(3000, freq="D") 
    result = count.asof(next18month).fillna(0).values - count.asof(day).fillna(0).values 
    if result[0] > 0: 
     return pd.Series(1, df.index) 
    else: 
     return pd.Series(0, df.index) 

然後我可以將函數應用於我的數據框,按ID分組:

df["everagain"] = df.groupby("id").apply(f) 

它不起作用。我相信result[0]是錯誤的。它第一次出現一個ID(它第二次計數,觸發一個真正的返回值),但如果給定的id有第二條記錄,並且沒有第三條記錄,它仍然返回'1'(真)第二個記錄。有人可以幫助使用正確的符號嗎?

(注意:3000天足以算作我的數據集的永久數)。

例如,如果DF看起來像:

| ID | Date 
0 | A | 2010-01-01 
1 | A | 2010-02-01 
2 | A | 2010-02-15 
3 | B | 2010-01-01 
4 | C | 2010-02-01 
5 | C | 2010-02-15 

然後輸出將有希望的樣子:

| ID | Date  | everagain 
0 | A | 2010-01-01 | 1 
1 | A | 2010-02-01 | 1 
2 | A | 2010-02-15 | 0 
3 | B | 2010-01-01 | 0 
4 | C | 2010-02-01 | 1 
5 | C | 2010-02-15 | 0 
+0

你能張貼你的框架樣本和預期的輸出嗎? – Jeff

回答

1

我本來以爲我可以使用.groupby("ID").last()但不能完全得到它的工作。 (我們可以用transform做到這一點,當然,但感覺就像太多的火力。)

如果你的數據是由date有序並具有連續的ID,但是,你可以簡單地比較ID是否等於下一ID 。例如:

>>> df = df.sort(["ID", "Date"]) 
>>> df 
    ID    Date 
0 A 2010-01-01 00:00:00 
1 A 2010-02-01 00:00:00 
2 A 2010-02-15 00:00:00 
3 B 2010-01-01 00:00:00 
4 C 2010-02-01 00:00:00 
5 C 2010-02-15 00:00:00 
>>> df["everagain"] = df["ID"] == df["ID"].shift(-1) 
>>> df 
    ID    Date everagain 
0 A 2010-01-01 00:00:00  True 
1 A 2010-02-01 00:00:00  True 
2 A 2010-02-15 00:00:00  False 
3 B 2010-01-01 00:00:00  False 
4 C 2010-02-01 00:00:00  True 
5 C 2010-02-15 00:00:00  False 

如果你想1和0,而不是True and False,你可以使用(df["ID"] == df["ID"].shift(-1))*1)(df["ID"] == df["ID"].shift(-1)).astype(int)將它們轉換。

+0

真的很聰明,而且效果很好。謝謝。但是,如果我純粹想知道身份證在接下來的3000天內是否有其他日期,該怎麼辦?沒有辦法讓我的功能起作用嗎? – user1893148