使用迭代值创建pandas DataFrame



我想创建一个包含五列的pandas DataFrame:日期、房屋类型、社区、房地产经纪人和邮政编码。

  • 2023年8月1日至2023年9月1日的日期范围
  • 有4种房屋类型
  • 6房地产经纪人
  • 只有一个邻域
  • 只有一个邮政编码因此,每个日期需要重复16次,为每个房屋类型,在这个唯一的社区,为每个房地产经纪人和一个独特的邮政编码。所以每天有16行。

我可以将连续的日期添加到日期列,但是,我在添加其余数据时遇到麻烦,我认为这些数据应该嵌套在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

每天的预期输出如下:

房屋类型tbody> <<tr>
日期小区房地产经纪人邮编
8/1/231亚历克斯10018
8/1/232亚历克斯10018
8/1/233亚历克斯10018
8/1/234亚历克斯10018
8/1/231玛吉10018
8/1/232玛吉10018
8/1/233玛吉10018
8/1/234玛吉10018
8/1/23110018
8/1/23210018
8/1/23310018
8/1/23410018
8/1/23110018
8/1/23210018
8/1/23310018
8/1/23410018

try this:

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

听起来像是笛卡尔积。我认为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),
...
]

您可以使用两个嵌套循环创建数据框架:

  • 第一个while循环迭代日期(你已经得到了一个覆盖)
  • 第二个for循环遍历房地产经纪人列表

您可以简单地创建临时数据帧df_temp,其中包含日期,realtor和房屋类型(从numpy数组中读取),将它们附加到列表中,最后将该数据帧列表连接到您的输出数据帧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列了!

最新更新