熊猫将数据合并到df中

时间:2019-07-16 18:27:27

标签: python pandas data-science

我有一个时间序列数据的CSV文件,该文件的一列标记为oatSensor(外部空气温度传感器根据来自不同过程的条件进行了过滤),我正在寻找一种将数据分类到“每天”的基础上(如果可能)。

例如,我可以使用下面的代码对整个数据集进行分类。对于外部空气温度值,其增量为-5至55。

import pandas as pd

df = pd.read_csv('ahu1OatFiltHourFilt.csv', index_col='Date', parse_dates=True)
df.describe()

cats = ['-5--1',
        '0-4','5-9','10-14','15-19','20-24',
        '25-29','30-34','35-39','40-44','45-49','50-54']
bins = [-5, 0,
        5, 10, 15, 20, 25, 30, 35,
       40, 45, 50, 55]

df2 = (df.groupby([df.index, pd.cut(df['oatSensor'], bins, labels=cats)])
            .size()
            .unstack(fill_value=0)
            .reindex(columns=cats, fill_value=0))

df2.sum(axis = 0)

将输出以下内容:

oatSensor

-5--1      3
0-4        6
5-9       19
10-14     49
15-19     65
20-24    125
25-29    230
30-34    201
35-39    171
40-44    205
45-49    179
50-54    183
dtype: int64

但是最终我希望找到一种方法:

1)为每个bin类别cats创建单独的df列 df4 = pd.DataFrame(df2, columns=cats)

2)每个day的每个容器中的sum重新采样整个数据帧

希望如此,我正在使用的数据在此git repo中。

感谢您的帮助。

编辑 如果我使用df3 = df2.stack(),那么除了重采样外,这为我提供了我想要的东西,但是我将如何实现创建单独的cats数据帧,然后每天对它们进行重采样?

Date                 oatSensor
2018-09-26 05:00:00  -5--1        0
                     0-4          0
                     5-9          0
                     10-14        0
                     15-19        0
                     20-24        0
                     25-29        0
                     30-34        0
                     35-39        0
                     40-44        0
                     45-49        0
                     50-54        1
2018-09-26 06:00:00  -5--1        0
                     0-4          0
                     5-9          0
                     10-14        0
                     15-19        0
                     20-24        0
                     25-29        0
                     30-34        0
                     35-39        0
                     40-44        0
                     45-49        0
                     50-54        1

2 个答案:

答案 0 :(得分:1)

尝试此代码。祝你好运;)

import pandas as pd

distance = 5
url = 'https://raw.githubusercontent.com/bbartling/Data/master/ahu1OatFiltHourFilt.csv'
df = pd.read_csv(url)
df['Date'] = pd.to_datetime(df['Date'])
min = df.oatSensor.min()
max = df.oatSensor.max()
min = int(min - (min % distance))
max = int(max + distance - (max % distance))
labels = ["{0} - {1}".format(i, i + distance) for i in range(min, max, 
distance)]
df['group'] = pd.cut(df.oatSensor, range(min, max + distance, distance), 
right=False, labels=labels)
df2 = df.groupby(['group']).count()
df['one'] = 1
df3 = df.pivot_table('one','Date','group')
print(df3.tail())

退出:

# group                -5 - 0  0 - 5  5 - 10  ...  85 - 90  90 - 95  95 - 100
# Date                                        ...                            
# 2019-07-06 13:00:00     NaN    NaN     NaN  ...      NaN      NaN       NaN
# 2019-07-06 14:00:00     NaN    NaN     NaN  ...      NaN      NaN       NaN
# 2019-07-06 15:00:00     NaN    NaN     NaN  ...      NaN      NaN       NaN
# 2019-07-06 16:00:00     NaN    NaN     NaN  ...      NaN      NaN       NaN
# 2019-07-09 15:00:00     NaN    NaN     NaN  ...      1.0      NaN       NaN

答案 1 :(得分:0)

我认为您想要的是一个数据框,其中每一行是您所描述的bin中看到的观测值总数的总和,并按观测日期进行索引。

如果是真的,那么我认为您超级棒,超级亲密!

更改

df2 = (df.groupby([df.index, pd.cut(df['oatSensor'], bins, labels=cats)]) .size() .unstack(fill_value=0) .reindex(columns=cats, fill_value=0))

阅读:

df2 = (df.groupby([df.index.date, pd.cut(df['oatSensor'], bins, labels=cats)]) .size() .unstack(fill_value=0) .reindex(columns=cats, fill_value=0))

更改是将.date添加到groupby中的第一个参数。这将为您提供如上所述的数据框。

我不确定每个cat都有单独的数据帧。从创建的数据框 中,您可以轻松地为任何列创建新的df:

df_cat = df2['-5--1']