获取pandas groupby对象以忽略丢失的数据帧

时间:2017-01-16 14:18:25

标签: python python-2.7 pandas group-by

我正在使用pandas来读取excel文件并将电子表格转换为数据帧。然后我应用groupby并使用get_group将各个组存储在变量中以便以后计算。 我的问题是输入文件的大小并不总是相同,有时groupby会产生10个dfs,有时候会产生25个等等。如果初始数据中缺少df,如何让程序忽略?

df = pd.read_excel(filepath, 0, skiprows=3, parse_cols='A,B,C,E,F,G',
                   names=['Result', 'Trial', 'Well', 'Distance', 'Speed', 'Time'])
df = df.replace({'-': 0}, regex=True) #replaces '-' values with 0
df = df['Trial'].unique()
gb = df.groupby('Trial') #groups by column Trial

trial_1 = gb.get_group('Trial     1')
trial_2 = gb.get_group('Trial     2')
trial_3 = gb.get_group('Trial     3')
trial_4 = gb.get_group('Trial     4')
trial_5 = gb.get_group('Trial     5')

说我的初始数据只有3个试验,我怎么能让它忽略试验4,5后来?我的代码在所有试验都存在的情况下运行但在某些试验失败时失败:(听起来非常像if语句需要,但我疲惫的大脑不知道在哪里......

提前致谢!

1 个答案:

答案 0 :(得分:0)

分组后,您可以使用属性.groups获取组,这将返回组名称的字典,然后您可以动态迭代dict键,这样您就不需要硬编码大小:

In [22]:
df = pd.DataFrame({'grp':list('aabbbc'), 'val':np.arange(6)})
df

Out[22]:
  grp  val
0   a    0
1   a    1
2   b    2
3   b    3
4   b    4
5   c    5

In [23]:
gp = df.groupby('grp')
gp.groups

Out[23]:
{'a': Int64Index([0, 1], dtype='int64'),
 'b': Int64Index([2, 3, 4], dtype='int64'),
 'c': Int64Index([5], dtype='int64')}

In [25]:    
for g in gp.groups.keys():
    print(gp.get_group(g))

  grp  val
0   a    0
1   a    1
  grp  val
2   b    2
3   b    3
4   b    4
  grp  val
5   c    5