python-3.x - 熊猫根据不同数据帧上每一行的信息创建新数据帧
问题描述
这就是我所拥有的:
ID PRICE VOLUME PRODUC FROM_DATE TO_DATE NUMDAYS
1 20.5 15.0 prod_1 2018-08-06 2018-08-13 7
2 15.6 10.0 prod_2 2018-08-06 2018-08-08 2
这就是我想要实现的目标:
ID PRICE VOLUME PRODUC FROM_DATE TO_DATE NUMDAYS
1 20.5 15.0 prod_1 2018-08-06 2018-08-07 1
1 20.5 15.0 prod_1 2018-08-07 2018-08-08 1
1 20.5 15.0 prod_1 2018-08-08 2018-08-09 1
1 20.5 15.0 prod_1 2018-08-09 2018-08-10 1
1 20.5 15.0 prod_1 2018-08-10 2018-08-11 1
1 20.5 15.0 prod_1 2018-08-11 2018-08-12 1
1 20.5 15.0 prod_1 2018-08-12 2018-08-13 1
2 15.6 10.0 prod_2 2018-08-06 2018-08-07 1
2 15.6 10.0 prod_2 2018-08-07 2018-08-08 1
所以我有一个数据框,其中包含有关影响不同日期的产品的信息。
- 产品可能会影响 1 天到 n 天。
- 音量会影响其间的每个日期。
我怎么能做到?
我尝试过: - 为数据框的每个元素执行一个 for 循环,但是
df_results = pd.DataFrame(columns=df.columns)
for index, row in df.iterrows():
day = row.to_dict()
for i in range(0,int(row['numdays'])):
day['NUMDAYS'] = 1
day['FROM_DATE'] = row['FROM_DATE']+datetime.timedelta(days=i)
day['TO_DATE'] = day['FROM_DATE'] + datetime.timedelta(days=1)
df_aux = pd.DataFrame.from_dict(day)
df_results .append(df_aux)
但是我不能让它工作。
解决方案
在 pandas 中最好避免循环,因为慢:
#convert columns to datetimes if necessary
df['FROM_DATE'] = pd.to_datetime(df['FROM_DATE'])
df['TO_DATE'] = pd.to_datetime(df['TO_DATE'])
#repeat rows
df = df.loc[np.repeat(df.index, df['NUMDAYS'])]
#add timedeltas by counter
df['FROM_DATE'] += pd.to_timedelta(df.groupby('ID').cumcount(), unit='d')
#add one dau
df['TO_DATE'] = df['FROM_DATE'] + pd.Timedelta(1, unit='d')
#assign scalar
df['NUMDAYS'] = 1
#create default unique index
df = df.reset_index(drop=True)
print (df)
ID PRICE VOLUME PRODUC FROM_DATE TO_DATE NUMDAYS
0 1 20.5 15.0 prod_1 2018-08-06 2018-08-07 1
1 1 20.5 15.0 prod_1 2018-08-07 2018-08-08 1
2 1 20.5 15.0 prod_1 2018-08-08 2018-08-09 1
3 1 20.5 15.0 prod_1 2018-08-09 2018-08-10 1
4 1 20.5 15.0 prod_1 2018-08-10 2018-08-11 1
5 1 20.5 15.0 prod_1 2018-08-11 2018-08-12 1
6 1 20.5 15.0 prod_1 2018-08-12 2018-08-13 1
7 2 15.6 10.0 prod_2 2018-08-06 2018-08-07 1
8 2 15.6 10.0 prod_2 2018-08-07 2018-08-08 1
推荐阅读
- r - 使用多个文字分隔符在 R 中的数据框中拆分字符串
- python - 无法解析 [{ 和 }] Python 之间返回的 JSON 数据
- python - Kivy 配置设置默认选项
- java - 尝试将文件上传到 slack chanel 并收到“invalid_form_data”或“no_file_data”错误
- python - 遍历字典列表并打印消息
- ocaml - OCaml中二叉树中的尾递归最大元素
- sql - Redshift中日期之间的时间间隔差异
- kotlin - Kotlin-没有从every.eager块中获取参数的值
- r - R - 在多个列中应用条件忽略 NA
- c++ - C++ MATLAB 引擎不会输出到控制台