使用迭代值创建PandasDataFrame

cbeh67ev  于 2023-01-19  发布在  其他
关注(0)|答案(3)|浏览(160)

我想创建一个有五列的PandasDataFrame:日期、房屋类型、邻居、房地产经纪人和邮政编码。

  • 日期范围为2023年8月1日至2023年9月1日
  • 共有4种户型
  • 6名房地产经纪人
  • 只有一个街区
  • 只有一个邮政编码所以每个日期需要重复16次,对于每种房子类型,在这个唯一的社区,对于每个房地产经纪人和一个唯一的邮政编码,所以每天有16行。

我可以将连续的日期添加到date列中,但是,添加其余的数据时遇到了麻烦,我认为这些数据应该嵌套在for循环中,到目前为止,我有以下几行:

import pandas as pd
from datetime import date,timedelta
delta = timedelta(days=1)
start = date(2023,8,1)
end=date(2023,9,1)
loop_date = start

df = pd.DataFrame(columns={"Date", "House type", "Neighborhood", "Realtor", "Zipcode"})
while loop_date<=end:
    df = df.append({"Date":loop_date},ignore_index=True)
    loop_date+=delta

每天的预期产出如下:
| 日期|户型|邻里|房地产经纪人|邮政编码|
| - ------|- ------|- ------|- ------|- ------|
| 2023年8月1日|1个|项目a|亚历克斯|小行星10018|
| 2023年8月1日|第二章|项目a|亚历克斯|小行星10018|
| 2023年8月1日|三个|项目a|亚历克斯|小行星10018|
| 2023年8月1日|四个|项目a|亚历克斯|小行星10018|
| 2023年8月1日|1个|项目a|玛吉|小行星10018|
| 2023年8月1日|第二章|项目a|玛吉|小行星10018|
| 2023年8月1日|三个|项目a|玛吉|小行星10018|
| 2023年8月1日|四个|项目a|玛吉|小行星10018|
| 2023年8月1日|1个|项目a|姜|小行星10018|
| 2023年8月1日|第二章|项目a|姜|小行星10018|
| 2023年8月1日|三个|项目a|姜|小行星10018|
| 2023年8月1日|四个|项目a|姜|小行星10018|
| 2023年8月1日|1个|项目a|帕特|小行星10018|
| 2023年8月1日|第二章|项目a|帕特|小行星10018|
| 2023年8月1日|三个|项目a|帕特|小行星10018|
| 2023年8月1日|四个|项目a|帕特|小行星10018|
任何帮助将不胜感激,谢谢!

qyswt5oh

qyswt5oh1#

试试这个:

import pandas as pd
from itertools import product

house_types = [1,2,3,4]
realtors = [*'ABCDEF']
neighborhood = ['a']
zip_code = ['10018']
daily_data = product(house_types, realtors, neighborhood, zip_code)
dates = pd.date_range('2023-8-1', '2023-9-1')
data = product(dates, daily_data)
idx, data = zip(*data)
cols = ["House_type", "Realtor", "Neighborhood", "Zipcode"]
df = pd.DataFrame(data, index=idx, columns=cols).rename_axis('Date')
print(df)
>>>
           House_type   Realtor    Neighborhood  Zipcode
Date                
2023-08-01  1           A               a        10018
2023-08-01  1           B               a        10018
2023-08-01  1           C               a        10018
2023-08-01  1           D               a        10018
2023-08-01  1           E               a        10018
   ...     ...         ...             ...        ...
2023-09-01  4           B               a        10018
2023-09-01  4           C               a        10018
2023-09-01  4           D               a        10018
2023-09-01  4           E               a        10018
2023-09-01  4           F               a        10018
vlju58qv

vlju58qv2#

这听起来像笛卡尔积,我认为itertools中的product可以帮助:

from itertools import product
list(product(['a', 'b', 'c'], ['Alex', 'Maggie', 'Ginger', 'Pat'], range(3)))

[('a', 'Alex', 0),
 ('a', 'Alex', 1),
 ('a', 'Alex', 2),
 ('a', 'Maggie', 0),
 ('a', 'Maggie', 1),
 ('a', 'Maggie', 2),
 ('a', 'Ginger', 0),
 ('a', 'Ginger', 1),
 ('a', 'Ginger', 2),
 ('a', 'Pat', 0),
 ('a', 'Pat', 1),
 ('a', 'Pat', 2),
 ('b', 'Alex', 0),
 ('b', 'Alex', 1),
 ('b', 'Alex', 2),
 ('b', 'Maggie', 0),
...
]
xggvc2p6

xggvc2p63#

您可以使用两个嵌套循环创建 Dataframe :

  • 第一个while循环迭代日期(您已经了解了这个循环)
  • 第二个for循环迭代房地产经纪人列表

您可以简单地创建包含日期、房地产经纪人和房屋类型的临时 Dataframe df_temp(从numpy数组中读取),将它们附加到一个列表中,最后将此 Dataframe 列表连接到您的输出 Dataframe df中:

import numpy as np
import pandas as pd
from datetime import date,timedelta
delta = timedelta(days=1)
start = date(2023,8,1)
end=date(2023,9,1)
loop_date = start
realtors = ['Alex', 'Maggie', 'Ginger', 'Pat']

list_of_dataframes = []

while loop_date<=end:
    for realtor in realtors:
        df_temp = pd.DataFrame(columns={"Date", "House type", "Realtor"})
        df_temp['House type'] = pd.Series(np.arange(1,5))
        df_temp['Date'] = loop_date
        df_temp['Realtor'] = realtor
        list_of_dataframes.append(df_temp)
        loop_date+=delta
df = pd.concat(list_of_dataframes)

完成此操作后,剩下要做的唯一事情就是填充NeighborhoodZipcode列!

相关问题