2017-06-12 107 views
0

我正在循环使用df.iterrows()数据框。我想设置每次访问的行数,而不是循环遍历所有行。首先我想访问前两行,然后是第三行到第六行,然后是剩下的行。有没有办法循环行?熊猫df.iterrows()方法来访问一定数量的行:

以下是我有:

import pandas as pd 
import numpy as np 
df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD')) 

df['key1'] = 0 
df.key1.iloc[0:3] = 1 
df.key1.iloc[3:7] = 2 
df.key1.iloc[7:] = 3 

df_grouped = df.groupby('key1') 

for group_name, group_value in df_grouped: 
    fig, axes = plt.subplots(rows, 1, sharex=True, sharey=True, figsize= (15, 20)) 
    for i,r in group_value.iterrows(): 
     rows, columns = group_value.shape 
     r = r[0:columns-1] 
     r.plot(kind='bar', fill=False, log=False) 
+0

你能告诉我们在每次迭代中必须有'i'的值吗?它会是一个标量还是一系列索引? – Divakar

+0

'i'是行号,并帮助使用df.iloc [I,1:]获取每行中的数据。因此,在循环中的每个实例都将是一个标量。谢谢你的帮助。不知道我是否已经很好地回答了你的问题,但我希望这是有道理的。 –

+0

那么,你如何使用这些索引组:[0,1],然后是[2,3,4,5],然后休息? – Divakar

回答

1

你可以根据你的病情创建一列,然后通过在该列做一组,遍历分组的数据。

df = pd.DataFrame(np.random.randn(10, 4), columns=list('ABCD')) 

df['key1'] = 0 
df.key1.iloc[1:3] = 1 
df.key1.iloc[3:7] = 2 
df.key1.iloc[7:] = 3 

df_grouped = df.groupby('key1') 

for group_name, group_value in df_grouped: 
    for i,r in group_value.iterrows(): 
     print i, max(r[:-1]) 
    print '-' * 80 
+0

谢谢,我试了上面的代码,这里是得到.. SettingWithCopyWarning: 值试图设置在一个从DataFrame的切片的副本。它不会实际切分数据帧。 –

+0

这只是一个例子,根据你的情况创建一个这样的列。请注意这只是一个警告,你应该检查df.key1 – user3256363

+0

的值感谢您的意见。我有进步。但是,我无法创建绘制每个子图的情节。在一组三个小组中,我只有一个小区绘制在没有其余两个小区的数据的情况下。它看起来像'r'值不会传递给'r.plot'。关于为什么它不传递给所有子图的任何输入?请参阅上面我原来的问题中的编辑。 –