从DataFrame创建一个在Python中缺少值的系列

时间:2015-03-06 19:47:41

标签: python pandas dataframe series

我想从我拥有的DataFrame中创建一个Pandas系列。

DataFrame有3列:'date','time'和'frequ'。 我希望前两列('date'和'time')成为新系列的索引。

不幸的是,我所拥有的数据包含缺失值。所以当我尝试转换为系列时,我有一个问题来指定索引。通常情况下,如果我没有缺失值,我会使用:

pd.Series()函数中的

index = pd.data_range(start = df.date[0], end = '2015/03/06 17:07:05', freq = 'S')

但是如果我在我的例子中这样做,那么我得到一个错误,因为新索引的长度比实际长度长(新的没有缺失值)。

所以这是我的DataFrame的一个小样本:

Out[2]: 
          date      time   frequ
0   2015/03/06  17:06:26  50.091
1   2015/03/06  17:06:27  50.087
2   2015/03/06  17:06:29  50.084
3   2015/03/06  17:06:30  50.083
4   2015/03/06  17:06:31  50.082
..         ...       ...     ...
33  2015/03/06  17:07:03  50.079
34  2015/03/06  17:07:04  50.078
35  2015/03/06  17:07:05  50.077

(可以看出,2015/03/06 17:06:28的值和时间丢失了)

这就是系列(ts)应该或多或少的样子:

2015/03/06  17:06:26  50.091
2015/03/06  17:06:27  50.087
2015/03/06  17:06:29  50.084
2015/03/06  17:06:30  50.083
2015/03/06  17:06:31  50.082
...              ...     ...
2015/03/06  17:07:03  50.079
2015/03/06  17:07:04  50.078
2015/03/06  17:07:05  50.077

再次,在这个结果中,前两列是索引

所以如果我打电话给例如:

In[3]: ts['2015/03/06 17:06:26': '2015/03/06 17:06:29']

我会得到:

out[3]: 
2015/03/06  17:06:26  50.091
2015/03/06  17:06:27  50.087
2015/03/06  17:06:29  50.084

Freq: S, dtype: float64

最后,这是我写的代码:

import pandas as pd

data = {'frequ': sum_freq, 'time': sum_time, 'date': date_list}
df = pd.DataFrame(data, columns = ['date', 'time', 'frequ'])
ts = pd.Series(df.frequ.values, index = ???)

有人知道如何克服这个问题吗?

感谢!!!

(我使用Python 2.7.6)

2 个答案:

答案 0 :(得分:2)

如果date列的dtype datetime64[ns]time列的dtype timedelta64[ns],则可以将它们添加到一起以形成dtype {{1}的新列}。然后,您可以将该列设置为索引,并选择datetime64[ns]列以获取所需的系列:

frequ

产量

import pandas as pd

df = pd.read_table('data', delim_whitespace=True)
df['date'] = pd.to_datetime(df['date'])
df['time'] = pd.to_timedelta(df['time'])
df['datetime'] = df['date'] + df['time']
ts = df.set_index(['datetime'])['frequ']

答案 1 :(得分:2)

扩展unutbu的答案,您还需要对索引进行分组以确保没有重复项。您需要决定如何处理任何此类重复项(例如将它们相加)。

index = df.groupby('datetime')['frequ'].sum()