我正在尝试在熊猫中创建一个循环以计算连续列之间的差异,并在新列中提供输出:
原始df:
**201601** **201602** **201603** **201602_201601** **201603_02**
100 200 500 100 300
所需的输出
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()
我的代码是我从stackoverflow帖子([add columns to a data frame calculated by for loops in python)修改的:
**201601** **201602** **201603** **201602_201601** **201603_201601** **201603_201602**
100 200 500 100 400 300
但是,我得到的输出如下:
<ul class="navbar-nav ml-auto">
<li class="nav-item dropdown" [routerLinkActive]="['active']" [routerLinkActiveOptions]="{exact:true}">
<!--Not sure about path of [routerLink]="['/login']" **make sure to check** -->
<a class="nav-link dropdown-toggle" [routerLink]="['/login']" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false">
{{userName}}
</a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
<!--
<a class="dropdown-item text-uppercase" href="">Profile</a>
<a class="dropdown-item text-uppercase" href="">Settings</a>
-->
<a class="dropdown-item">Logout</a>
</div>
</li>
</ul>
我已经使用pd.diff来完成我需要的操作,但无法找出for循环代码。任何帮助将不胜感激。
谢谢
答案 0 :(得分: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
在使用熊猫时,请始终避免使用for
循环
答案 1 :(得分: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')