【问题标题】:Python/Pandas Iterating through columnsPython/Pandas 遍历列
【发布时间】: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 - 我认为最好的方法是在问题中添加所需的输出,也许在另一个问题中你可以这样做;)

标签: python loops pandas dataframe iteration


【解决方案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 对象,那么几乎总有更好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    • 2022-01-19
    • 2018-10-20
    • 2016-05-03
    • 2017-09-23
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多