【问题标题】:Pandas Creating Dataframes from LoopsPandas 从循环中创建数据框
【发布时间】:2017-06-01 23:18:02
【问题描述】:

我正在尝试制作一个数据框,以便可以轻松地将其发送到 CSV,否则我必须手动执行此过程..

我希望这是我的最终输出。每个人都有从 2014 年 1 月 1 日到 2016 年 12 月 1 日的月份和年份组合:

      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)

当我尝试循环创建数据框时,它要么不起作用,要么出现索引错误(由于不匹配的列表),我不知所措。

我进行了大量搜索,并找到了一些类似的以下链接,但我无法对工作进行逆向工程以适合我的情况。

Filling empty python dataframe using loops

How to build and fill pandas dataframe from for loop?

我不希望任何人觉得他们在“做我的功课”,所以如果我对一些简单的事情感到厌烦,请告诉我。

【问题讨论】:

  • append不是inplace进程,所以需要重新分配:df = df.append({'date': month}, ignore_index=True)
  • @root 谢谢!这让我更接近,但仍然不是我需要的地方。通过重新分配,月份在最后一个列表名称(克里斯)之后。在month 循环之前添加此for index, row in df.iterrows(): 会有所帮助,但我该如何为每个人执行此操作?

标签: python python-3.x loops pandas dataframe


【解决方案1】:

我认为您可以将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
...
...

【讨论】:

  • 这很有帮助,谢谢!了解概述您如何得出此答案的任何资源(甚至是文档)。我了解解决方案,但我确信在该资源中它将使我免于回答类似这样的其他问题。
【解决方案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']]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2019-09-11
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多