如何在用常量增量替换值的同时循环pandas中的行和列

时间:2016-06-24 10:54:44

标签: python-2.7 pandas dataframe multiple-columns cumsum

我正在尝试用0替换数据框中的值。第一列我需要替换第一个3值,下一列是第一个6值,所以每次增加3

a=np.array([133,124,156,189,132,176,189,192,100,120,130,140,150,50,70,133,124,156,189,132])
b = pd.DataFrame(a.reshape(10,2), columns= ['s','t'])
for columns in b:
    yy = 3
    for i in xrange(yy):
        b[columns][i] = 0 
    yy += 3
print b

结果如下

      s    t
0     0    0
1     0    0
2     0    0
3   189  189
4   132  132
5   176  176
6   189  189
7   192  192
8   100  100
9   120  120

我显然遗漏了一些非常简单的东西,让循环取代6值,而不是3列中的t,任何想法?

2 个答案:

答案 0 :(得分:0)

你需要在循环前使用yy=3

yy = 3
for columns in b:
   for i in xrange(yy):
        b[columns][i] = 0 
    yy += 3
print b

Python 3解决方案:

yy = 3
for columns in b:
    for i in range(yy):
        b[columns][i] = 0 
    yy += 3

print (b)
     s    t
0    0    0
1    0    0
2    0    0
3  189    0
4  100    0
5  130    0
6  150   50
7   70  133
8  124  156
9  189  132

另一种解决方案:

yy= 3

for i, col in enumerate(b.columns):
    b.ix[:i*yy+yy-1, col] = 0

print (b)
     s    t
0    0    0
1    0    0
2    0    0
3  189    0
4  100    0
5  130    0
6  150   50
7   70  133
8  124  156
9  189  132

答案 1 :(得分:0)

我会这样做:

i = 1
for c in b.columns:
    b.ix[0 : 3*i-1, c] = 0
    i += 1

演示:

In [86]: b = pd.DataFrame(np.random.randint(0, 100, size=(20, 4)), columns=list('abcd'))

In [87]: %paste
i = 1
for c in b.columns:
    b.ix[0 : 3*i-1, c] = 0
    i += 1
## -- End pasted text --

In [88]: b
Out[88]:
     a   b   c   d
0    0   0   0   0
1    0   0   0   0
2    0   0   0   0
3   10   0   0   0
4    8   0   0   0
5   49   0   0   0
6   55  48   0   0
7   99  43   0   0
8   63  29   0   0
9   61  65  74   0
10  15  29  41   0
11  79  88   3   0
12  91  74  11   4
13  56  71   6  79
14  15  65  46  81
15  81  42  60  24
16  71  57  95  18
17  53   4  80  15
18  42  55  84  11
19  26  80  67  59