2015-12-10 85 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(列表)