Pandas中多索引的新增功能。我有看起来像这个的数据
Date Time value
2014-01-14 12:00:04 .424
12:01:12 .342
12:01:19 .341
...
12:05:49 .23
2014-05-12 ...
1:02:42 .23
....
现在,我想访问每个日期的最后时间,并将值存储在某个数组中。我做了一个像这样的多索引
df= pd.read_csv("df.csv",index_col=0)
df.index = pd.to_datetime(df.index,infer_datetime_format=True)
df.index = pd.MultiIndex.from_arrays([df.index.date,df.index.time],names=['Date','Time'])
df= df[~df.index.duplicated(keep='first')]
dates = df.index.get_level_values(0)
所以我把日期保存为一个数组。我想迭代日期,但要么语法不正确,要么访问值不正确。我尝试过for循环,但无法运行(for date in dates
),也无法进行直接访问(df.loc[dates[i]]
或类似的操作)。此外,每个日期中的时间变量数量也各不相同。有什么办法解决这个问题吗?
这听起来像是groupby/max
操作。更具体地说,您希望按Date
分组,并通过取max
来聚合Time
。由于聚合只能对列值进行,因此我们需要将Time
索引级别更改为一列(通过使用reset_index
):
import pandas as pd
df = pd.DataFrame({'Date': ['2014-01-14', '2014-01-14', '2014-01-14', '2014-01-14', '2014-05-12', '2014-05-12'], 'Time': ['12:00:04', '12:01:12', '12:01:19', '12:05:49', '01:01:59', '01:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['Date'] = pd.to_datetime(df['Date'])
df = df.set_index(['Date', 'Time'])
df = df.reset_index('Time', drop=False)
max_times = df.groupby(level=0)['Time'].max()
print(max_times)
产生
Date
2014-01-14 12:05:49
2014-05-12 1:02:42
Name: Time, dtype: object
如果希望选择整行,则可以使用idxmax
,但需要注意。idxmax
返回索引标签。因此,索引必须唯一,标签才能表示唯一的行。由于Date
级别本身并不是唯一的,要使用idxmax
,我们需要完全使用reset_index
(为唯一整数创建索引):
df = pd.DataFrame({'Date': ['2014-01-14', '2014-01-14', '2014-01-14', '2014-01-14', '2014-05-12', '2014-05-12'], 'Time': ['12:00:04', '12:01:12', '12:01:19', '12:05:49', '01:01:59', '1:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['Date'] = pd.to_datetime(df['Date'])
df['Time'] = pd.to_timedelta(df['Time'])
df = df.set_index(['Date', 'Time'])
df = df.reset_index()
idx = df.groupby(['Date'])['Time'].idxmax()
print(df.loc[idx])
产生
Date Time value
3 2014-01-14 12:05:49 0.23
5 2014-05-12 01:02:42 0.23
在保留MultiIndex的同时,我看不出有什么好方法可以做到这一点。在设置MultiIndex之前,更容易执行groupby
操作。此外,最好将日期时间保留为一个值,而不是将其拆分为两个部分。请注意,给定类似Series的日期时间/周期,.dt
访问器可根据需要方便地访问date
和time
。因此,您可以按Date
进行分组,而无需制作Date
列:
df = pd.DataFrame({'DateTime': ['2014-01-14 12:00:04', '2014-01-14 12:01:12', '2014-01-14 12:01:19', '2014-01-14 12:05:49', '2014-05-12 01:01:59', '2014-05-12 01:02:42'], 'value': [0.42399999999999999, 0.34200000000000003, 0.34100000000000003, 0.23000000000000001, 0.0, 0.23000000000000001]})
df['DateTime'] = pd.to_datetime(df['DateTime'])
# df = pd.read_csv('df.csv', parse_dates=[0])
idx = df.groupby(df['DateTime'].dt.date)['DateTime'].idxmax()
result = df.loc[idx]
print(result)
产生
DateTime value
3 2014-01-14 12:05:49 0.23
5 2014-05-12 01:02:42 0.23