我有一个pandas.DataFrame
,看起来像这样:
Time(minutes) column2 column1
420 1 5
420 2 10
420 3 8
421 1 4
421 2 9
421 3 7
我知道如何使用iterrows()逐行迭代,但是有没有一种有效的方法在列(时间)中按时间单位进行迭代,以便我可以在每次迭代中处理给定时间的数据?类似的东西:
time = 420
while(time <= max_time):
temp <- fetch the sub-dataframe for given time
process(temp)
update original df with temp #guaranteed it won't affect any other rows other than the current set of rows
time += 1
答案 0 :(得分:4)
您可以使用.groupby()
按时间迭代,而不是按行进行迭代:
for grp in df.groupby('Time(minutes)'):
...
df = pd.read_fwf(StringIO(u"""
Time(minutes) column2 column1
420 1 5
420 2 10
420 3 8
421 1 4
421 2 9
421 3 7"""), header=1)
print(df)
for grp in df.groupby('Time(minutes)'):
print(grp)
Time(minutes) column2 column1
0 420 1 5
1 420 2 10
2 420 3 8
3 421 1 4
4 421 2 9
5 421 3 7
(420, Time(minutes) column2 column1
0 420 1 5
1 420 2 10
2 420 3 8)
(421, Time(minutes) column2 column1
3 421 1 4
4 421 2 9
5 421 3 7)
答案 1 :(得分:1)
有两种方法可以去。第一个基本上保持迭代格式的方法是手动对数据帧进行子集化:
for time in df['time_minutes'].unique():
temp = df.loc[df['time_minutes'] == time]
process(temp)
# or alternatively, make your changes directly on temp (depending what they are),
# for example, something like this:
# df.loc[df['time_minutes'] == time, 'some_column_name'] = assign_something_here
另一种,可能更有效的方法是使用this article上面建议的groupby