从 Python 中缺失值的 DataFrame 创建一个 Series
create a Series from a DataFrame that has missing values in Python
我想从我拥有的 DataFrame 在 pandas 中创建一个系列。
DataFrame 有 3 列:'date'、'time' 和 'frequ'。 我希望前两列('date' 和 'time')是新系列的索引。
不幸的是,我拥有的数据包含缺失值。 因此,当我尝试转换为 Series 时,我在指定索引时遇到了问题。通常,如果我没有缺失值,我会使用:
index = pd.data_range(start = df.date[0], end = '2015/03/06 17:07:05', freq = 'S')
在 pd.Series( ) 函数中。
但是如果我在示例中这样做,则会出现错误,因为新索引的长度比实际索引长(新索引没有缺失值)。
所以这是我的 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)
如果 date
列的数据类型为 datetime64[ns]
而 time
列的数据类型为 timedelta64[ns]
那么你可以将它们加在一起形成一个新的数据类型列 datetime64[ns]
。然后你可以将该列设置为索引和 select 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']
产量
datetime
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
Name: frequ, dtype: float64
扩展unutbu的答案,你还需要对索引进行分组以确保没有重复。您需要决定如何处理任何此类重复项(例如对它们求和)。
index = df.groupby('datetime')['frequ'].sum()
我想从我拥有的 DataFrame 在 pandas 中创建一个系列。
DataFrame 有 3 列:'date'、'time' 和 'frequ'。 我希望前两列('date' 和 'time')是新系列的索引。
不幸的是,我拥有的数据包含缺失值。 因此,当我尝试转换为 Series 时,我在指定索引时遇到了问题。通常,如果我没有缺失值,我会使用:
index = pd.data_range(start = df.date[0], end = '2015/03/06 17:07:05', freq = 'S')
在 pd.Series( ) 函数中。
但是如果我在示例中这样做,则会出现错误,因为新索引的长度比实际索引长(新索引没有缺失值)。
所以这是我的 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)
如果 date
列的数据类型为 datetime64[ns]
而 time
列的数据类型为 timedelta64[ns]
那么你可以将它们加在一起形成一个新的数据类型列 datetime64[ns]
。然后你可以将该列设置为索引和 select 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']
产量
datetime
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
Name: frequ, dtype: float64
扩展unutbu的答案,你还需要对索引进行分组以确保没有重复。您需要决定如何处理任何此类重复项(例如对它们求和)。
index = df.groupby('datetime')['frequ'].sum()