2017-01-17 6 views
2

Я пытаюсь сделать dataframe так что я могу отправить его в CSV легко, в противном случае я должен сделать этот процесс вручную ..Панды Создание Dataframes из Loops

я хотел бы, чтобы это мой окончательный вывод , У каждого человека есть месяц и год комбо, который начинается в 1/1/2014 и идет в 12/1/2016:

 Name date 
0  ben  1/1/2014 
1  ben  2/1/2014 
2  ben  3/1/2014 
3  ben  4/1/2014 
.... 

12 dan  1/1/2014 
13 dan  2/1/2014 
14 dan  3/1/2014 

код до сих пор:

import pandas as pd 

days = [1] 
months = list(range(1, 13)) 
years = ['2014', '2015', '2016'] 
listof_people = ['ben','dan','nathan', 'gary', 'Mark', 'Sean', 'Tim', 'Chris'] 

df = pd.DataFrame({"Name": listof_people}) 
for month in months: 
    df.append({'date': month}, ignore_index=True) 
print(df) 

Когда я пытаюсь зацикливание, чтобы создать dataframe он либо не работает, я получаю ошибки индекса (из-за несоответствующих списков), и я не понимаю.

Я немного поработал и нашел несколько похожих ссылок, но я не могу перестроить работу, чтобы соответствовать моему делу.

Filling empty python dataframe using loops

How to build and fill pandas dataframe from for loop?

Я не хочу, чтобы кто-нибудь чувствовать, что они «делают свою домашнюю работу», так что если я derping на что-то простое, пожалуйста, дайте мне знать.

+1

'append' не является Inplace процесс, так что вам нужно для переназначения: 'df = df.append ({'date': month}, ignore_index = True)'. – root

+0

@root спасибо! это все ближе, но все еще не там, где мне нужно быть. с переназначением, месяцы появляются после последнего имени списка (являющегося Крисом). Добавление этого 'for index, row в df.iterrows():' перед циклом 'month' помогает, но как это сделать для каждого человека? – MattR

ответ

3

Я думаю, что вы можете использовать product для всех комбинации с to_datetime для столбца date:

from itertools import product 

days = [1] 
months = list(range(1, 13)) 
years = ['2014', '2015', '2016'] 
listof_people = ['ben','dan','nathan', 'gary', 'Mark', 'Sean', 'Tim', 'Chris'] 

df1 = pd.DataFrame(list(product(listof_people, months, days, years))) 
df1.columns = ['Name', 'month','day','year'] 
print (df1) 
     Name month day year 
0  ben  1 1 2014 
1  ben  1 1 2015 
2  ben  1 1 2016 
3  ben  2 1 2014 
4  ben  2 1 2015 
5  ben  2 1 2016 
6  ben  3 1 2014 
7  ben  3 1 2015 
8  ben  3 1 2016 
9  ben  4 1 2014 
10  ben  4 1 2015 
... 
... 
df1['date'] = pd.to_datetime(df1[['month','day','year']]) 
df1 = df1[['Name','date']] 
print (df1) 
     Name  date 
0  ben 2014-01-01 
1  ben 2015-01-01 
2  ben 2016-01-01 
3  ben 2014-02-01 
4  ben 2015-02-01 
5  ben 2016-02-01 
6  ben 2014-03-01 
7  ben 2015-03-01 
... 
... 
+0

Это очень помогает, спасибо! Знайте о любых ресурсах, которые описывают, как вы пришли к этому ответу (даже документация). Я понимаю решение, но я уверен, что в этом ресурсе он спасет меня от ответа на другие вопросы, подобные этому. – MattR

2
mux = pd.MultiIndex.from_product(
    [listof_people, years, months], 
    names=['Name', 'Year', 'Month']) 

pd.Series(
    1, mux, name='Day' 
).reset_index().assign(
    date=pd.to_datetime(df[['Year', 'Month', 'Day']]) 
)[['Name', 'date']] 

enter image description here

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