2015-12-10 5 views
0

Вот проблема, которую я тянуть CSV в кадр данных панд, который выглядит так:условно вставки строк в панде DataFrame

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

мне нужно затем вызвать Идентичность Apple, найти его минимальный и максимальную дату и вставить строки, т.е. месяцев для того, чтобы интерполировать между двумя точками, так что конечный результат становится

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 

проблема заключается в том, что, хотя я могу перебрать список идентификаторов и получить все строки, связанные я не могу показаться, чтобы найти путь к затем вставьте дополнительные строки, особенно без противной петли. по существу мне нужно преодолеть разрыв между датами и заполнить связанные значения Identity нулями.

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

EDIT:

Рабочий код ниже:

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

Я полагаю, что добавление этого дополнительного кода не помогает, поскольку я хочу, чтобы это работало с использованием фреймворка данных pandas для скорости. Вы считаете, что интерполяция между не существующими датами путем вставки строк будет как один лайнер. –

+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 (список)

Смежные вопросы