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