Python通过数据帧操作来形成更大的数据帧

2024-04-20 04:32:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我想转身

pd.DataFrame({'Id':['A','B'],
              'beginDate':['2017-01-01','2017-01-03'],
              'endDate':['2017-01-02','2017-01-05']})

    Id  beginDate   endDate
0   A   2017-01-01  2017-01-02
1   B   2017-01-02  2017-01-05

进入

pd.DataFrame({'Id':['A','A','A','B','B','B','B'],
         'Date':['2017-01-01','2017-01-02','2017-01-03','2017-01-02',
                 '2017-01-03','2017-01-04','2017-01-05']})

    Date       Id
0   2017-01-01  A
1   2017-01-02  A
2   2017-01-03  A
3   2017-01-02  B
4   2017-01-03  B
5   2017-01-04  B
6   2017-01-05  B

其概念是用开始日期和结束日期之间的所有值填充第二个数据帧

我可以成功地使用for循环,并为每个唯一的'Id'附加一个新的数据帧,但这非常慢

for循环通过在每一行上循环使用下面的语句

def dfChange(uniqueId, startDate, endDate):

allDates = pd.date_range(startDate, endDate)
df = pd.DataFrame({'Date':allDates})
df['Id'] = uniqueId
return df

不使用for循环就可以这样做吗


Tags: 数据id概念dataframedffordatedef
1条回答
网友
1楼 · 发布于 2024-04-20 04:32:32

可以使用^{}^{}来首先重塑形状

然后将索引转换为^{}

最后用^{}调用^{}^{}

所有数据都在index中,因此请按[[]]选择“无列”

df = pd.DataFrame({'Id':['A','B'],
              'beginDate':['2017-01-01','2017-01-02'],
              'endDate':['2017-01-03','2017-01-05']})
print (df)
  Id   beginDate     endDate
0  A  2017-01-01  2017-01-03
1  B  2017-01-02  2017-01-05

df = df.melt('Id', value_name='Date', var_name='a').set_index('Date')
df.index = pd.to_datetime(df.index)
df=df.groupby('Id').resample('B')[[]].ffill().reset_index()
print (df)
  Id       Date
0  A 2017-01-01
1  A 2017-01-02
2  A 2017-01-03
3  B 2017-01-02
4  B 2017-01-03
5  B 2017-01-04
6  B 2017-01-05

相关问题 更多 >