2016-05-13 6 views
1

私はgroupbyでPython Pandasに苦労しています。私は次のことをどのように達成するべきですか?すべての果実について、その果実の「ステップ0」の価値との違いを見つけたいと思います。Python pandas groupby列ごとにフィルタリングされた他の行との違い

df = pd.DataFrame({'Fruit' : ['Apple', 'Apple', 'Apple', 'Banana', 'Banana', 'Banana'], 'Step' : [0, 1, 2, 0, 1, 2], 'Value' : [100, 102, 105, 200, 210, 195] }) 

    Fruit Step Value  to-be 
0 Apple  0 100 --> 0 
1 Apple  1 102 --> 2 
2 Apple  2 105 --> 5 
3 Banana  0 200 --> 0 
4 Banana  1 210 --> 10 
5 Banana  2 195 --> -5 

ありがとうございます!

答えて

5

これはそれを行う必要があります。

df.groupby('Fruit').apply(lambda g: g.Value - g[g.Step == 0].Value.values[0]) 

まず、我々はあなたが(果物)を気列によってグループ化しています。次に、各グループに機能を適用します(lambdaを使用すると、関数をインラインで指定できます)。各グループについて、行を見つけてg.Step == 0とし、その行から値エントリを取得し、values[0]を使用して最初の値を取得します(複数の場所がある場合はg.Step == 0)。次に、グループ内のすべての行からその1つの値を減算し、それを返します。

あなたがデータフレームの列として追加したい場合は、インデックスを削除することができます

res = df.groupby('Fruit').apply(lambda g: g.Value - g[g.Step == 0].Value.values[0]) 
df['Result'] = res.reset_index(drop=True) 
+0

DropEdit = True) 'ValueErrorのために私のために働かない:1を渡したアイテムの数が間違っている、インデックスが3を意味する ' – SparkAndShine

+0

@sparkandshineが奇妙です。どのバージョンのPythonを使用していますか?これは2.7.3でうまく動作します。 – ASGM

+0

私のPythonのバージョンは '2.7.6'です。 – SparkAndShine

1

が、これはトリックを行う考えてみてください。これは単に行をループし、ステップが0になるたびに新しい「最初の」値を適用します。そして、最初の値との差を計算します。

rows = range(df.shape[0]) 
df['count'] = 0 
for r in rows: 
    step = df.iloc[r,1] 
    value = df.iloc[r,2] 
    if step == 0: 
     first = value 
    df.iloc[r,3] = value - first 
+0

これは間違いなく動作しますが、大きなデータフレームではグループ化よりも遅くなります。一般的に、個々の行を繰り返すことは、パンダが提供しなければならないことを十分に活用しません。 (私はあなたの答えを攻撃するためにこれを言及しませんが、誰かが私がパンダを学び始めたときに同じヒントをくれたので、本当に役に立ちました)。 – ASGM

+0

私は完全に同意します、ここであなたの答えは間違いなく強くなります。しかし、私は時々思う(特にこれは初心者のためだと思うので)シンプルなものを扱い、より簡単に加えることができます。私は私が始めたときに私の頭を掴むのが難しい "ラムダ"を見つけました! – EllieFev

+0

非常に真実!物事を行う方法が複数あることを知ることは常に有用です(私が入れた方法よりも良い方法があると確信しています)。 – ASGM

1

私はpandasの初心者ですが、少なくとも以下のコードが動作します。次のように結果の端部は、

Fruit Step Value to-be 
0 Apple  0 100  0 
1 Apple  1 102  2 
2 Apple  2 105  5 
3 Banana  0 200  0 
4 Banana  1 210  10 
5 Banana  2 195  -5 

[6 rows x 4 columns] 


ソースコードです。

import pandas as pd 

df = pd.DataFrame({'Fruit' : ['Apple', 'Apple', 'Apple', 'Banana', 'Banana', 'Banana'], 
        'Step' : [0, 1, 2, 0, 1, 2], 
        'Value' : [100, 102, 105, 200, 210, 195] }) 

list_groups = list() 

# loop over dataframe groupby `Fruit` 
for name, group in df.groupby('Fruit'): 
    group.sort('Step', ascending=True) # sorted by `Step` 

    row_iterator = group.iterrows() 

    # get the base value 
    idx, first_row = row_iterator.next() 
    base_value = first_row['Value'] 

    to_be = [0] # store the values of the column `to-be` 
    for idx, row in row_iterator: 
     to_be.append(row['Value'] - base_value) 

    # add a column to group 
    group['to-be'] = pd.Series(to_be, index=group.index) 

    list_groups.append(group) 


# Concatenate dataframes 
result = pd.concat(list_groups) 

print(result) 

@ASGM、私はこの行 `DF [ '結果'] = res.reset_index(あなたのコード、

res = df.groupby('Fruit').apply(lambda g: g.Value - g[g.Step == 0].Value.values[0]) 
df['Result'] = res.reset_index(drop=True) 

を実行しますが、問題が発生し、

Traceback (most recent call last): 
    File "***.py", line 9, in <module> 
    df['Result'] = res.reset_index(drop=True) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1887, in __setitem__ 
    self._set_item(key, value) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/frame.py", line 1968, in _set_item 
    NDFrame._set_item(self, key, value) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/generic.py", line 1068, in _set_item 
    self._data.set(key, value) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 3024, in set 
    self.insert(len(self.items), item, value) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 3039, in insert 
    self._add_new_block(item, value, loc=loc) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 3162, in _add_new_block 
    self.items, fastpath=True) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 1993, in make_block 
    placement=placement) 
    File "/usr/lib/python2.7/dist-packages/pandas/core/internals.py", line 64, in __init__ 
    '%d' % (len(items), len(values))) 
ValueError: Wrong number of items passed 1, indices imply 3 
[Finished in 0.4s with exit code 1] 
関連する問題