python-3.x - 数据框:将基于行的交易数据转换为每个日期的聚合

标签 python-3.x pandas dataframe formatting

我以以下格式从 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

可以为查询指定日期范围,以便它概述在指定日期范围内哪个司机有哪些运输工具,按日期排序。

我想要做的转换目标是为每个驱动程序制定每周计划,范围内的日期在可用列中排序。所以对于上面的数据,这看起来像下面这样:
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

有什么方法可以通过数据帧操作实现所描述的输出?在单个数据列中,我需要保持顺序,即首先加载,然后卸载,然后如果日期相同,则转到下一个数据行。

最佳答案

我会写我的伪解决方案,它实际上是一个解决方案,它只缺少一个实体,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

有了这个非透视数据框,我现在可以像日程表一样根据需要对它进行透视。
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

现在,我将值任务 + 地址添加为一列。
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)

我将得到以下数据框:
Date                02.05.2020  ...                05.05.2020
Driver                          ...                          
Franz                      NaN  ...  Unloading: 14231, Berlin
Peter   Loading: 12342, Berlin  ...                       NaN

现在,正如我在答案开头所说的,假设同一天有多个加载和卸载操作,您需要某种任务标识符来匹配哪个任务属于哪个任务。您需要分配某种 task_id然后把它放在Compound柱子。

注意:我使用了 '; '为了分离任务,您可能需要使用其他东西。

您可以在 gist 中查看完整的代码文件.

关于python-3.x - 数据框:将基于行的交易数据转换为每个日期的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62212898/

相关文章:

python - 将行移动到另一个数据帧时如何加快 Pandas contains 的速度

r - 使用 dplyr 在数据导入中仅保留一个唯一列

python - 获取数据框中不同子集的最大值和总和值。还绘制每个子集

loops - 从 Python 3.x 中的另一个列表中删除单独的项目列表

python - CV2 OpenCL,cv2.UMat 对象不可迭代

python - 在 Python 中将一个数据帧中的值替换为第二个数据帧中的值

Python 请求不响应正确的 html

python - 比较 2 个数据框中每列有多少个不同值

python - 如何在 Pandas 中添加堆积条形图孵化? (...或者如何在 Pandas 情节与 matplotlib 中获得 BarContainer 与 AxisSubplot?)

python - 是否有一种有效的方法来检查列是否具有混合 dtypes?