我有一个数据框,我想从中提取一些数据并将其附加到新的数据结构中。
使用的数据是几年,有些单位是每小时的数据。 我还附加了一些代码以突出显示该结构。
我想做的是尽可能地“自动化”该过程,以便可以将.csv文件更改为具有相同结构/标题的另一个文件。
现在我的新数据框看起来有点不好...
我还试图排除一些年份,仅提供2018年的数据,不确定我是否以正确的方式进行操作。
我尝试进行连接,但效果很好,但这很手工。 我不得不用手动短语将其拆分,然后将其连接起来,这似乎是一个糟糕的解决方案。但是,当我现在在图形中运行它时,我确实得到了想要的输出,我只是觉得数据框应该更好。
它们都具有相同的索引值“小时”,而有些则在一天中的某些时间段具有空白字段。
df_hourly = pd.read_csv('hourlydatafrom2015.txt')
test_name unit_name value units Year Week Hour
0 35 - Test1 Unit1 814 11 2015 1 11
1 35 - Test1 Unit1 1837 14 2015 1 12
2 35 - Test1 Unit1 5333 41 2015 1 13
3 35 - Test1 Unit1 9726 70 2015 1 14
4 35 - Test1 Unit1 9021 66 2015 1 15
df_hourly = df_hourly[df_hourly.Year > 2018]
df_hourly.loc[df_hourly['Year'] > 2018]
unit_names = df_hourly['unit_name'].unique().tolist()
def single_sorter(name):
tester_total_units_per_hour = df_hourly[df_hourly['unit_name'] == name].groupby('Hour')[['units']].sum()
tester_total_units = df_hourly['units'][df_hourly['unit_name'] == name].sum()
new_tester_units = tester_total_units_per_hour / tester_total_units
new_tester_units.rename(columns={'units' : '{} units'.format(name)}, inplace=True)
test_1 = new_tester_units
return test_1
newer_data_frame = pd.DataFrame ()
for value in unit_names:
newer_data_frame = newer_data_frame.append(single_sorter(value), ignore_index=False, sort=False)
print(newer_data_frame)
Unit1 units nan units Unit3 units Unit5 units Unit2 units \
Hour
9 0.000231 NaN NaN NaN NaN
10 0.025275 NaN NaN NaN NaN
11 0.058652 NaN NaN NaN NaN
12 0.076798 NaN NaN NaN NaN
13 0.080039 NaN NaN NaN NaN
14 0.091195 NaN NaN NaN NaN
15 0.115776 NaN NaN NaN NaN
16 0.141468 NaN NaN NaN NaN
17 0.135034 NaN NaN NaN NaN
18 0.104388 NaN NaN NaN NaN
19 0.080965 NaN NaN NaN NaN
20 0.061707 NaN NaN NaN NaN
21 0.028470 NaN NaN NaN NaN
7 NaN NaN 0.036825 NaN NaN
8 NaN NaN 0.032389 NaN NaN
9 NaN NaN 0.048226 NaN NaN
列表继续,因此似乎在下面添加了索引值,而不是使用相同的索引值。我希望索引索引值介于07-21之间的数据框,然后旁边的每个单元都有行。
我是一个试图转换为Python的Excel书呆子,所以这可能是解决这个问题的一种非常艰难/糟糕的方法...在制作函数之前看起来更糟...
感谢您的帮助!
答案 0 :(得分:0)
结果正常:append用于将新行追加到数据框。如果要追加列,则应使用merge
或join
。由于结果数据框应以Hour
列作为索引,因此我建议使用newer_data_frame
以来所有不同的小时数来初始化df_hourly
,并始终加入single_sorter
的结果。
代码将变为:
...
newer_data_frame = pd.DataFrame(df_hourly.Hour.drop_duplicates()).set_index('Hour')
for value in unit_names:
newer_data_frame = newer_data_frame.join(single_sorter(value))
...