循环到列表的不同位置

时间:2017-04-14 12:56:33

标签: python pandas for-loop

我想循环到一个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]

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)