在Python Pandas中,我如何基于两列连接df的行?按照第三个的顺序呢?



Python Pandas

我正在尝试合并/连接一个pandas数据框架上的行。我有一个包含列['Id','Date','Hour','Sales']的表。

如果我按df按'Hour' count()分组,它将像这样:

'ID' 'Date' 'Hour'01/01/22 2401/01/22 2403 01/02/2203/02/22 24

有几个Id,有时有相同的日期,但每个唯一的Id/date有24行唯一的"小时"。(每个日期有24行,并按ID重复日期。)

我需要一些代码的帮助,这将采取唯一的一对ID和日期,并连接24行信息,在'小时'列的顺序。

因此,结果将是每个唯一的ID和日期,将有一个向量,连接小时信息。

问题在于,每次连接都必须基于'Id'和'Date'两列,并按照'hour'列的顺序进行。

感谢ppl的帮助。

设置:

下面是一个简短的示例和一些代码,用于将'Sales'数据移动到每个小时的单独列中。您可以根据自己的情况在3到24的范围内更改该值。

import pandas as pd
df = pd.DataFrame([['Dave', 1, 0, 10],['Dave', 1, 1, 20],['Dave', 1, 2, 30],
['Dave', 2, 0, 40],['Dave', 2, 1, 50],['Dave', 2, 2, 60],
['Carl', 1, 0, 15],['Carl', 1, 1, 25],['Carl', 1, 2, 35],
['Carl', 2, 0, 45],['Carl', 2, 1, 55],['Carl', 2, 2, 65]],
columns=['ID', 'Date', 'Hour', 'Sales'])

输出(df):

ID  Date  Hour  Sales
0   Dave     1     0     10
1   Dave     1     1     20
2   Dave     1     2     30
3   Dave     2     0     40
4   Dave     2     1     50
5   Dave     2     2     60
6   Carl     1     0     15
7   Carl     1     1     25
8   Carl     1     2     35
9   Carl     2     0     45
10  Carl     2     1     55
11  Carl     2     2     65

Where' and 'Merge':

这里的关键是使用pandas.merge函数和on参数来选择使用哪些列作为合并的索引。

df。在那里,df。合并,然后df。

new = pd.DataFrame(columns=['ID','Date'])
for hour in range(3):
tmp = df.where(df.Hour == hour).dropna(axis=0, how='all')
tmp[hour] = tmp['Sales']
tmp.drop(['Hour','Sales'], axis=1, inplace=True)
new = new.merge(tmp, how='outer', on=['ID','Date'])
new.set_index(['ID','Date'], inplace=True)

输出(新):

0     1     2
ID   Date                  
Dave 1.0   10.0  20.0  30.0
2.0   40.0  50.0  60.0
Carl 1.0   15.0  25.0  35.0
2.0   45.0  55.0  65.0

数据透视表:

对于这个特定的问题,您可以使用数据透视表来为您完成所有的工作。

dfp = df.pivot(index=['ID','Date'], columns='Hour', values='Sales')

输出(dfp):

Hour        0   1   2
ID   Date            
Carl 1     15  25  35
2     45  55  65
Dave 1     10  20  30
2     40  50  60