【问题标题】:iterate through pandas dataframe consecutive columns遍历熊猫数据框连续列
【发布时间】:2019-05-09 12:53:48
【问题描述】:

我正在尝试在 pandas 中创建一个循环来计算连续列之间的差异并在新列中给出输出:

原始df:

**201601** **201602** **201603**  
100           200         500

期望的输出

**201601** **201602** **201603**  **201602_201601** **201603_02**
100           200         500         100          300

我的代码是我从 stackoverflow 帖子 ([add columns to a data frame calculated by for loops in python) 中修改的:

for i in df.iloc[:,2:5]:
  for j in df.iloc[:,2:5]:
    if i == j:
        break
    else:
        bina = df[i]-df[j]
        df['MOM_' + str(j) + '_' + str(i)] = bina
df.head()

但是,我得到的输出如下:

**201601** **201602** **201603**  **201602_201601** **201603_201601** **201603_201602**
100           200         500         100          400   300

我已经使用 pd.diff 来完成我需要的操作,但无法弄清楚 for 循环代码。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • for 循环是您可能想要去的相反方向。如果您想迭代数据框,那么您可能根本不想拥有数据框。您应该尝试寻找矢量化方法

标签: python pandas


【解决方案1】:

这只是修复你的代码

col=df.columns
for x,i in enumerate(col):
    for y,j in enumerate(col):
        if  y-x==1 and i!=j:
            bina = df[i]-df[j]
            df['MOM_' + str(j) + '_' + str(i)] = bina
df.columns
Out[1210]: 
Index(['**201601**', '**201602**', '**201603**', 'MOM_**201602**_**201601**',
       'MOM_**201603**_**201602**'],
      dtype='object')

【讨论】:

  • 感谢 W-B 的及时回复。稍作修改后,该代码对我有用。但是,您能否详细说明检查 'y-x'==1 时代码在做什么。
  • @vagautam 确保只计算继续输入
【解决方案2】:

使用diff 和带有zip 的简单列表解析来构造列的名称。

cols = [f'{b}_{a}' for (a,b) in zip(df.columns, df.columns[1:])]
df[cols] = df.diff(axis=1).dropna(axis=1)

    201601  201602  201603  201602_201601   201603_201602
0   100     200     500     100             300

在使用 pandas 时始终避免使用for 循环

【讨论】:

  • 你是第一个,我承认。
猜你喜欢
  • 1970-01-01
  • 2021-11-09
  • 2017-06-08
  • 1970-01-01
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多