pandas dataframe使用apply为值组添加多行

时间:2017-11-26 16:26:02

标签: python pandas apply

我有一个pandas数据框包含以下列:

sate_1      state_2 
-----       -----
New York    Washington
Ohio        Utah

我想要做的是为state_1和state_2的每个不同组合构建一个输入日期,结果将是:

sate_1       state_2          date_time
New York     Washington     2017-11-01 00:00
New York     Washington     2017-11-01 03:00
New York     Washington     2017-11-01 06:00
Ohio         Utah           2017-11-01 00:00
Ohio         Utah           2017-11-01 03:00
Ohio         Utah           2017-11-01 06:00

所以基本上对于每个不同的行我想从今天开始返回3个时间段。 我有获取日期时间的逻辑,但我通过所有记录的循环这样做,这是一个耗时,因为我的数据将包含超过1M的行。我想知道有没有办法使用apply函数来实现这一点,我假设它会更快。

1 个答案:

答案 0 :(得分:0)

设置

import pandas as pd
df = pd.DataFrame({'state_1': ['New York', 'Ohio'],
                   'state_2': ['Washington', 'Utah']})
# df:
#       state_1     state_2
# 0     New York    Washington
# 1     Ohio        Utah

将三个所需日期中的第一个添加到每一行

df['date'] = pd.to_datetime('2017-11-01')
# df:
#       state_1     state_2     date
# 0     New York    Washington      2017-11-01
# 1     Ohio        Utah            2017-11-01

对于每一行,创建一个包含所有三个所需日期的新DataFrame,在这些日期之间广播状态名称,并将DataFrame列表连接成一个

pd.concat([
    pd.DataFrame(
        {'state_1': row.state_1,
         'state_2': row.state_2,
         'date': pd.date_range(row.date, freq='3h', periods=3)
        }
    ) for i, row in df.iterrows()
], ignore_index=True).loc[:, ['state_1', 'state_2', 'date']]
# df:
#   state_1     state_2     date
# 0 New York    Washington  2017-11-01 00:00:00
# 1 New York    Washington  2017-11-01 03:00:00
# 2 New York    Washington  2017-11-01 06:00:00
# 3 Ohio        Utah        2017-11-01 00:00:00
# 4 Ohio        Utah        2017-11-01 03:00:00
# 5 Ohio        Utah        2017-11-01 06:00:00