2015-12-10 121 views
0

這裏的問題是我拉一個csv成熊貓的數據幀,看起來像這樣:有條件地將行插入大熊貓數據幀

Identity Date  value1 value2 Random 
Apple  1/1/2005 10  10  Orange 
Apple  12/1/2005 1   1   Orange 

我需要再調用身份蘋果,發現它的最小值和最大值的日期,插入行,即個月,以便在兩點之間進行插值,以便最終結果變成

Identity Date  value1 value2 Random 
Apple  1/1/2005 10  10  Orange 
Apple  2/1/2005 0   0   Orange 
Apple  3/1/2005 0   0   Orange 
.    .  .   .   . 
.    .  .   .   . 
.    .  .   .   . 
Apple  12/1/2005 1   1   Orange 

的問題是,雖然我可以通過標識列表循環,並獲得相關的所有行我似乎無法找到一種方法,然後插入額外的行,尤其是沒有討厭的循環。基本上我需要彌合日期間隔並用零填充關聯的身份值。

list = ['Apple','Banana','Orange']  
for i in range(0,len(list)) 
    data.loc[data['Identity'].isin(list[i])] 

編輯:

工作下面的代碼:

import pandas as pd 

df = pd.DataFrame([['Apple',pd.to_datetime('1/1/2005'),10,10,'Orange'], ['Orange', pd.to_datetime('8/1/2005'),1, 1 ,'Apple'],['Apple',   pd.to_datetime('12/1/2005'),1, 1 ,'Orange']]) 
df.columns = ['Identity','Date', 'value1' , 'value2','Random'] 

full_df = pd.DataFrame() 
dummydata = [] 

indentity = ['Apple','Orange'] 
random = ['Orange','Apple'] 
years = ['2005','2005'] 

for i in range(0,2): 
    full_df = pd.DataFrame() 
    full_df['Date'] = [pd.to_datetime(str(x)+'/1/'+str(years[i])) for x in range(1,13)] 
    full_df['Identity'] = indentity[i] 
    full_df['Random'] = random[i] 
    dummydata.append(full_df) 

full_df = pd.concat(dummydata)      
result = full_df.merge(df,how='left').fillna(0) 
#print(dummydata) 
#print(full_df) 
print(result) 
+0

歡迎來到StackOverflow!你可以嘗試提供一個最小的例子與csv數據,然後代碼爲最小的例子?這樣我們可以複製csv數據並嘗試代碼,併爲您提供幫助。例如,你不需要氣體,水等,也許只有2列。當你在你的例子中使用'Apple'時,它有點混淆,你的代碼反映了不同的變量。 – imp9

+0

我想添加這個額外的代碼不會有幫助,因爲我希望這可以使用熊貓數據框來提高速度。你會認爲通過插入行來插入非現有日期之間的內插就像是一個班輪 –

+0

我建議將原始代碼減少到最小,以便你和其他人更容易找到你的錯誤。我很困惑,因爲它不符合這個例子。 – imp9

回答

1

我的建議是建立完整的理論DF,數據和fillna合併:

import pandas as pd 

df = pd.DataFrame([['Apple',pd.to_datetime('1/1/2005'),10,10,'Orange'],['Apple', pd.to_datetime('12/1/2005'),1, 1 ,'Orange']]) 
df.columns = ['Identity','Date', 'value1' , 'value2','Random'] 

full_df = pd.DataFrame() 
full_df['Date'] = [pd.to_datetime(str(x)+'/1/2005') for x in range(1,13)] 
full_df['Identity'] = 'Apple' 

result = full_df.merge(df,how='left').fillna(0) 
result 

這是對一個身份和年份有好處,循環多年和身份,將所有創建的DF附加到列表中,並將pd.concat(列表)