Python/Pandas 遍历列

Posted

技术标签:

【中文标题】Python/Pandas 遍历列【英文标题】:Python/Pandas Iterating through columns 【发布时间】:2016-12-08 21:58:27 【问题描述】:

我有一个看起来像这样的 DataFrame(有许多额外的列)

          age1     age2      age3     age 4   \
Id#     
1001         5        6         2          8  
1002         7        6         1          0
1003        10        9         7          5
1004         9       12         5          9 

我正在尝试编写一个循环,将每一列与之前的列相加,并将其返回到一个新的 DataFrame。 我已经开始了,简单地说:

New = pd.DataFrame()
New[0] = SFH2.ix[:,0]
for x in SFH2:
    ls = [x,x+1]
    B = SFH2[ls].sum(axis=1)
    New[x] = B

print(New)  

我得到的错误是

    ls = [x,x+1]

TypeError: Can't convert 'int' object to str implicitly

我知道 int 和 str 是不同的对象,但是我怎样才能克服这个问题,或者是否有不同的方法来遍历列? 谢谢!

【问题讨论】:

您能否明确说明您希望输出的内容是什么? 换句话说,您希望每一列是左侧所有列的总和,还是只是该列和左侧(右侧?)的单个列的总和。 我希望每一列都是左边所有列的总和。 @cmf05 - 我认为最好的方法是在问题中添加所需的输出,也许在另一个问题中你可以这样做;) 【参考方案1】:

您可以将addshifted DataFrame 一起使用:

print (df.shift(-1,axis=1))
      age1  age2  age3  age4
Id#                         
1001   6.0   2.0   8.0   NaN
1002   6.0   1.0   0.0   NaN
1003   9.0   7.0   5.0   NaN
1004  12.0   5.0   9.0   NaN

print (df.add(df.shift(-1,axis=1), fill_value=0))
      age1  age2  age3  age4
Id#                         
1001  11.0   8.0  10.0   8.0
1002  13.0   7.0   1.0   0.0
1003  19.0  16.0  12.0   5.0
1004  21.0  17.0  14.0   9.0

如果需要换档1(默认参数,省略):

print (df.shift(axis=1))
      age1  age2  age3  age4
Id#                         
1001   NaN   5.0   6.0   2.0
1002   NaN   7.0   6.0   1.0
1003   NaN  10.0   9.0   7.0
1004   NaN   9.0  12.0   5.0

print (df.add(df.shift(axis=1), fill_value=0))
      age1  age2  age3  age4
Id#                         
1001   5.0  11.0   8.0  10.0
1002   7.0  13.0   7.0   1.0
1003  10.0  19.0  16.0  12.0
1004   9.0  21.0  17.0  14.0

【讨论】:

【参考方案2】:

听起来cumsum 就是你要找的东西:

In [5]: df
Out[5]: 
      age1  age2  age3  age4
Id#                         
1001     5     6     2     8
1002     7     6     1     0
1003    10     9     7     5
1004     9    12     5     9

In [6]: df.cumsum(axis=1)
Out[6]: 
      age1  age2  age3  age4
Id#                         
1001     5    11    13    21
1002     7    13    14    14
1003    10    19    26    31
1004     9    21    26    35

【讨论】:

啊,谢谢!显然我需要对 pandas 再熟悉一点。 @piRSquared 好吧,OP 有点模棱两可。该代码似乎暗示了窗口为 2 的滚动总和,但所需输出的描述暗示了 cumsum @cmf05 如果您发现自己正在编写 for 循环来处理 pandas 对象,那么几乎总有更好的方法。

以上是关于Python/Pandas 遍历列的主要内容,如果未能解决你的问题,请参考以下文章

Python / Pandas:循环遍历数字列表

Python pandas 遍历数据框

Python Pandas 遍历DataFrame的正确姿势 速度提升一万倍

Python Pandas 遍历DataFrame的正确姿势 速度提升一万倍

Python Pandas 遍历DataFrame的正确姿势 速度提升一万倍

Python Pandas 遍历行并访问列名