#python #python-3.x #pandas
#python #python-3.x #pandas
Вопрос:
У меня есть следующие типы данных:
Я хочу выводить данные в нижеприведенных ежедневных формах (ниже приведен пример, в котором я хочу преобразовать данные строки 1 в Daily, а затем строки 2 и … (Диапазон дат не является фиксированным)):
Во-первых, я просто хочу спросить эксперта о возможности такого рода обработки данных в python. Я пытаюсь использовать следующий код:
# data1 = dataframe name
data1['Daily']=(data1['Total Spot']/((data1['Event End']-data1['Event Start']).dt.days) 1)
for date in data1:
pd.date_range(data1['Event Start'], data1['Event End'],freq='D')
Что я должен включить в приведенный выше код, чтобы получить желаемый результат?
Ответ №1:
Вы можете использовать понимание списка с выравниванием для новых DataFrame
, а затем DataFrame.merge
вместе с исходными данными:
data1 = pd.DataFrame({'Event Start':['03/28/2018','04/02/2018'],
'Event End':['04/03/2018','04/05/2018'],
'Team 1':['AAB','AAC'],
'Team 2':['BBB','ABC'],
'Total Spot':[160, 350]})
c = ['Event Start','Event End']
data1[c] = data1[c].apply(pd.to_datetime)
data1['Daily']=(data1['Total Spot']/((data1['Event End']-data1['Event Start']).dt.days) 1)
print (data1)
Event Start Event End Team 1 Team 2 Total Spot Daily
0 2018-03-28 2018-04-03 AAB BBB 160 27.666667
1 2018-04-02 2018-04-05 AAC ABC 350 117.666667
L = [(i, x) for i, s, e in zip(data1.index, data1['Event Start'], data1['Event End'])
for x in pd.date_range(s, e)]
df = (pd.DataFrame(L, columns=['idx','Day'])
.merge(data1.drop(c ['Total Spot'], axis=1), left_on='idx', right_index=True)
.drop('idx', axis=1))
print (df)
Day Team 1 Team 2 Daily
0 2018-03-28 AAB BBB 27.666667
1 2018-03-29 AAB BBB 27.666667
2 2018-03-30 AAB BBB 27.666667
3 2018-03-31 AAB BBB 27.666667
4 2018-04-01 AAB BBB 27.666667
5 2018-04-02 AAB BBB 27.666667
6 2018-04-03 AAB BBB 27.666667
7 2018-04-02 AAC ABC 117.666667
8 2018-04-03 AAC ABC 117.666667
9 2018-04-04 AAC ABC 117.666667
10 2018-04-05 AAC ABC 117.666667
Другое подобное решение:
zipped = zip(data1['Team 1'], data1['Team 2'],
data1['Daily'], data1['Event Start'], data1['Event End'])
L = [(x, t1, t2, d) for t1, t2, d, s, e in zipped for x in pd.date_range(s, e)]
print (L)
df = pd.DataFrame(L, columns=['Day', 'Team 1','Team 2','Daily'])
print (df)
Day Team 1 Team 2 Daily
0 2018-03-28 AAB BBB 27.666667
1 2018-03-29 AAB BBB 27.666667
2 2018-03-30 AAB BBB 27.666667
3 2018-03-31 AAB BBB 27.666667
4 2018-04-01 AAB BBB 27.666667
5 2018-04-02 AAB BBB 27.666667
6 2018-04-03 AAB BBB 27.666667
7 2018-04-02 AAC ABC 117.666667
8 2018-04-03 AAC ABC 117.666667
9 2018-04-04 AAC ABC 117.666667
10 2018-04-05 AAC ABC 117.666667
Комментарии:
1. Большое вам спасибо @jezrael, у меня все работает нормально.