如何使用熊猫将“源数据框”转换为“目标数据框”?
源数据框的datefrom和dateto是日期范围,我希望将其转换为每周的日期范围,如结果“目标数据框”。
DateFrom DateTo Catalog Score
2017-05-01 2017-05-21 ABC 20
2017-05-22 2017-06-04 WXY 30
DateFrom DateTo Catalog Score
2017-05-01 2017-05-07 ABC 20
2017-05-08 2017-05-14 ABC 20
2017-05-15 2017-05-21 ABC 20
2017-05-22 2017-05-28 WXY 30
2017-05-29 2017-06-04 WXY 30
答案 0 :(得分:0)
使用melt
对齐DateFrom
和DateTo
,然后groupby(Catalog)
上的resample
和DateTo
进行正向填充。
使用DateFrom
重建TimeDelta
。
melted = pd.melt(df, id_vars=["Catalog", "Score"], var_name="x", value_name="DateTo")
df2 = (
melted.set_index(pd.to_datetime(melted.DateTo))
.drop(["x", "DateTo"],1)
.groupby("Catalog", as_index=False)
.resample("W")
.ffill()
.reset_index(level=1)
)
df2["DateFrom"] = df2.DateTo - pd.Timedelta("6 days")
输出:
df2[df.columns]
Catalog Score
Catalog date
ABC 2017-05-07 ABC 20
2017-05-14 ABC 20
2017-05-21 ABC 20
WXY 2017-05-28 WXY 30
2017-06-04 WXY 30
数据:
df
DateFrom DateTo Catalog Score
0 2017-05-01 2017-05-21 ABC 20
1 2017-05-22 2017-06-04 WXY 30
答案 1 :(得分:0)
在Expanding pandas data frame with date range in columns上扩展类似问题的答案,您可以按以下步骤遍历每一行并扩展数据框
import pandas as pd
from datetime import timedelta
newdf = pd.concat(
[
pd.DataFrame(
{
'DataFrom':
pd.date_range(row.DateFrom, row.DateTo, freq='W-MON'),
'DateTo':
pd.date_range(
row.DateFrom + timedelta(days=6),
row.DateTo + timedelta(days=6),
freq='W'),
'Catalog':
row.Catalog,
'Score':
row.Score
},
columns=['DataFrom', 'DateTo', 'Catalog', 'Score'])
for i, row in df.iterrows()
],
ignore_index=True)
这将打印以下输出
newdf
DataFrom DateTo Catalog Score
0 2017-05-01 2017-05-07 ABC 20
1 2017-05-08 2017-05-14 ABC 20
2 2017-05-15 2017-05-21 ABC 20
3 2017-05-22 2017-05-28 WXY 30
4 2017-05-29 2017-06-04 WXY 30