Ayr*_*rat 28 python next pandas
我在熊猫里有一个df
import pandas as pd
df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])
Run Code Online (Sandbox Code Playgroud)
我想迭代df中的行.对于每一行我想要行s value and next row的值类似(它不起作用):
for i, row in df.iterrows():
print row['value']
i1, row1 = next(df.iterrows())
print row1['value']
Run Code Online (Sandbox Code Playgroud)
结果我想要
'AA'
'BB'
'BB'
'CC'
'CC'
*Wrong index error here
Run Code Online (Sandbox Code Playgroud)
在这一点上,我有办法解决这个问题
for i in range(0, df.shape[0])
print df.irow(i)['value']
print df.irow(i+1)['value']
Run Code Online (Sandbox Code Playgroud)
有没有更有效的方法来解决这个问题?
ali*_*sdt 20
首先,你的"混乱方式"是可以的,在数据帧中使用索引没有任何问题,这不会太慢.iterrows()本身并不是非常快.
你的第一个想法的版本将是:
row_iterator = df.iterrows()
_, last = row_iterator.next() # take first item from row_iterator
for i, row in row_iterator:
print(row['value'])
print(last['value'])
last = row
Run Code Online (Sandbox Code Playgroud)
第二种方法可以做类似的事情,将一个索引保存到数据帧中:
last = df.irow(0)
for i in range(1, df.shape[0]):
print(last)
print(df.irow(i))
last = df.irow(i)
Run Code Online (Sandbox Code Playgroud)
当速度至关重要时,您可以随时尝试并为代码计时.
HYR*_*YRY 10
文档中有一个pairwise()功能示例itertools:
from itertools import tee, izip
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = tee(iterable)
next(b, None)
return izip(a, b)
import pandas as pd
df = pd.DataFrame(['AA', 'BB', 'CC'], columns = ['value'])
for (i1, row1), (i2, row2) in pairwise(df.iterrows()):
print i1, i2, row1["value"], row2["value"]
Run Code Online (Sandbox Code Playgroud)
这是输出:
0 1 AA BB
1 2 BB CC
Run Code Online (Sandbox Code Playgroud)
但是,我认为它中的行DataFrame很慢,如果你能解释你想要解决的问题,也许我可以建议一些更好的方法.
我会使用 shift() 函数如下:
df['value_1'] = df.value.shift(-1)
[print(x) for x in df.T.unstack().dropna(how = 'any').values];
Run Code Online (Sandbox Code Playgroud)
产生
AA
BB
BB
CC
CC
Run Code Online (Sandbox Code Playgroud)
这是上面代码的工作原理:
步骤 1) 使用移位功能
df['value_1'] = df.value.shift(-1)
print(df)
Run Code Online (Sandbox Code Playgroud)
产生
value value_1
0 AA BB
1 BB CC
2 CC NaN
Run Code Online (Sandbox Code Playgroud)
步骤2)转置:
df = df.T
print(df)
Run Code Online (Sandbox Code Playgroud)
产生:
0 1 2
value AA BB CC
value_1 BB CC NaN
Run Code Online (Sandbox Code Playgroud)
步骤 3) 拆垛:
df = df.unstack()
print(df)
Run Code Online (Sandbox Code Playgroud)
产生:
0 value AA
value_1 BB
1 value BB
value_1 CC
2 value CC
value_1 NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)
步骤 4)删除 NaN 值
df = df.dropna(how = 'any')
print(df)
Run Code Online (Sandbox Code Playgroud)
产生:
0 value AA
value_1 BB
1 value BB
value_1 CC
2 value CC
dtype: object
Run Code Online (Sandbox Code Playgroud)
步骤 5) 返回 DataFrame 的 Numpy 表示,并按值打印值:
df = df.values
[print(x) for x in df];
Run Code Online (Sandbox Code Playgroud)
产生:
AA
BB
BB
CC
CC
Run Code Online (Sandbox Code Playgroud)