Cut*_*7er 5 formatting dataframe python-3.x pandas
我以以下格式从 SQLITE 数据库中检索数据(并将其转换为 Pandas 数据帧):
Driver | Date loading | Date unloading | Loading Adress | Unloading Address
Peter | 02.05.2020 | 03.05.2020 | 12342, Berlin | 14221, Utrecht
Peter | 03.05.2020 | 04.05.2020 | 14221, Utrecht | 13222, Amsterdam
Franz | 03.05.2020 | 03.05.2020 | 11111, Somewher| 11221, Somewhere2
Franz | 03.05.2020 | 05.05.2020 | 11223, Upsalla | 14231, Berlin
Run Code Online (Sandbox Code Playgroud)
可以为查询指定日期范围,以便它概述在指定日期范围内哪个司机有哪些运输工具,按日期排序。
我想要做的转换目标是为每个驱动程序制定每周计划,范围内的日期在可用列中排序。所以对于上面的数据,这看起来像下面这样:
Driver | 02.05.2020 | 03.05.2020 | 04.05.2020 | 05.05.2020 |
Peter | Loading: | Unloading: Unloading:
12342, Berlin 14221, Utrecht 13222, Amsterdam
Loading:
14221, Utrecht
Franz | | Loading: | | Unloading:
11111, Somewher 14231, Berlin
Unloading:
11221, Somewhere2
Loading:
11223, Upsalla
Run Code Online (Sandbox Code Playgroud)
有什么方法可以通过数据帧操作实现所描述的输出?在单个数据列中,我需要保持顺序,即首先加载,然后卸载,然后如果日期相同,则转到下一个数据行。
我将编写我的伪解决方案,实际上它是一个解决方案,它只缺少一个实体,task_id稍后我将详细说明。我将调用您的日期框架(有问题的第一个日期框架)df,并创建一个转换后的版本作为t_df. 这t_df将是一个未透视的表,其中日期和地址是统一的。
我将创建一个数据框,如下所示:
Driver | Date | Task | Address
Peter | 02.05.2020 | Loading | 12342, Berlin
Peter | 03.05.2020 | Unloading | 14221, Utrecht
Run Code Online (Sandbox Code Playgroud)
有了这个 unpivot 数据框,我现在可以按照您想要的方式旋转它,就像时间表一样。
m,n = df.shape
t_df = pd.DataFrame(columns=['driver', 'date', 'task', 'address'])
t_df['Driver'] = df['Driver'].tolist() * 2
t_df['Date'] = df['Date loading'].tolist() + df['Date unloading'].tolist()
t_df['Address'] = df['Loading Address'].tolist() + df['Unloading Address'].tolist()
t_df['Task'] = ['Loading'] * m + ['Unloading'] * m
Run Code Online (Sandbox Code Playgroud)
现在,我将值任务 + 地址添加为一列。
t_df['Compound'] = t_df[['Task', 'Address']].agg(': '.join, axis=1)
concat_array = lambda x: '; '.join(x)
schedule = pd.crosstab(index=t_df['Driver'], columns=t_df['Date'], values=t_df['Compound'],
aggfunc=concat_array)
Run Code Online (Sandbox Code Playgroud)
我将得到以下数据框:
Date 02.05.2020 ... 05.05.2020
Driver ...
Franz NaN ... Unloading: 14231, Berlin
Peter Loading: 12342, Berlin ... NaN
Run Code Online (Sandbox Code Playgroud)
现在,正如我在答案一开始所说的那样,假设同一天有多个加载和卸载操作,您需要某种任务标识符来匹配哪个任务属于哪个任务。您需要分配某种类型task_id,然后将其放入Compound列中。
注意:我用于'; '分离任务,您可能想使用其他东西。
您可以在gist中查看完整的代码文件。
| 归档时间: |
|
| 查看次数: |
195 次 |
| 最近记录: |