2016-06-22 15 views
3

は、Letterのいずれかの値が同じ場合、shift()を使用して以前のインデックスからデータを取り込みたいと考えています。Pandasデータフレームの行を比較するために適用関数内のshift()関数を使用する

import pandas as pd 
df = pd.DataFrame(data=[['A', 'one'], 
         ['A', 'two'], 
         ['B', 'three'], 
         ['B', 'four'], 
         ['C', 'five']], 
        columns=['Letter', 'value']) 

df['Previous Value'] = df.apply(lambda x : x['value'] if x['Letter'].shift(1) == x['Letter'] else "", axis=1) 
print df 

私はエラーを取得しています:

AttributeError: ("'str' object has no attribute 'shift'", u'occurred at index 0') 

所望の出力:

Letter value Previous Value 
0  A one    
1  A two   one 
2  B three    
3  B four   three 
4  C five    
shiftを使用して、現在の行が前の行と一致して、あなたの条件に

答えて

4

使用where

In [11]: 
df = pd.DataFrame(data=[['A', 'one'], 
         ['A', 'two'], 
         ['B', 'three'], 
         ['B', 'four'], 
         ['C', 'five']], 
        columns=['Letter', 'value']) 
​ 
df['Previous Value'] = df['value'].shift().where(df['Letter'].shift() == df['Letter'], '') 
df 
​ 
Out[11]: 
    Letter value Previous Value 
0  A one    
1  A two   one 
2  B three    
3  B four   three 
4  C five    
1

Seriesの代わりに、指定された行の指定された列の値に.shift()を適用しようとしています。私はグループバイを使ってこれを行います:

In [6]: df['Previous letter'] = df.groupby('Letter').value.shift() 

In [7]: df 
Out[7]: 
    Letter value Previous letter 
0  A one    NaN 
1  A two    one 
2  B three    NaN 
3  B four   three 
4  C five    NaN 
関連する問題