以时间为单位迭代数据帧而不是逐行

时间:2018-02-25 15:01:11

标签: python pandas dataframe

我有一个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

2 个答案:

答案 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