我想循环到一个pandas数据帧变量列表,但有可能选择不同的索引位置
raw_data = {'v1': [10,np.nan,50,30],'v2': [10,-10,50,-20],'v3':[120,-130,509,-230],'v4': [5,78,34,66]}
df = pd.DataFrame(raw_data, columns = ['v1','v2','v3','v4'])
columns = ['v1','v2','v3','v4']
#pseudo code: i+1 represents the following element in the list, after "i" element
for i in columns:
print(df[i])
print(df[i+1])
在现实生活中我想对变量对进行更复杂的操作,比如将函数应用于v1和v3,然后是v2和v4,然后是v3和v5等。
例如:创建一个名为'new_varv1的新var,它是v1和v3之间的差异。然后循环将对v2和v4执行相同的操作,将结果存储在new_varv2等中
for i in columns:
df['new_var'+i]=df[i]-df[i+2]
答案 0 :(得分:0)
如果我正确理解你的问题,你可以这样做:
ctr = 1
for i in columns:
print(df[i])
print(df[columns[ctr]])
ctr+=1
答案 1 :(得分:0)
最pythonic和推荐的方法是enumerate()
https://docs.python.org/2.3/whatsnew/section-enumerate.html
for (i, c) in enumerate(columns, start=1):
print(df[c])
print(df[columns[i-1]])
请参阅Python - Previous and next values inside a loop
更复杂的例子
有时,如果只需要上一个/下一个元素,我会使用
prev = df[columns[0]]
if columns
for i in columns[1:]:
next = df[i]
print(next)
print(prev)
prev = next
或者只是采用经典循环
for i in range(len(columns)-1):
print(df[columns[i]])
print(df[columns[i+1]])
如果你觉得很时髦
for next, prev in zip(columns, columns[0:]):
print(df[next])
print(df[prev])
枚举解决方案中提供的索引有助于检查 该索引值不超出列表边界。
如果你非常不喜欢使用索引变量,你可能会 使用deque,这是列表之类的,可能尝试 - 除了静音边界错误
from collections import deque
c = deque(columns)
for c0 in c[1:-3]:
print(df[c0])
print(df[c[-1]])
print(df[c[3]])
c.rotate(-1)