2016-08-17 5 views
4

私は関係する状況に陥っています。のは、私はローンの次の例のデータフレームを持っているとしましょう:パンダグループはすべて適用

test_df = pd.DataFrame({'name': ['Jack','Jill','John','Jack','Jill'], 
        'date': ['2016-08-08','2016-08-08','2016-08-07','2016-08-08','2016-08-08'], 
        'amount': [1000.0,1500.0,2000.0,2000.0,3000.0], 
        'return_amount': [5000.0,2000.0,3000.0,0.0,0.0], 
        'return_date': ['2017-08-08','2017-08-08','2017-08-07','','2017-08-08']}) 

test_df.head() 

    amount date  name return_amount return_date 
0 1000.0 2016-08-08 Jack 5000.0   2017-08-08 
1 1500.0 2016-08-08 Jill 2000.0   2017-08-08 
2 2000.0 2016-08-07 John 3000.0   2017-08-07 
3 2500.0 2016-08-08 Jack 0.0 
4 2500.0 2016-08-08 Jill 0.0    2017-08-08 

私は名前(人によって融資をグループ化する)ことによって、このデータフレームをグループ化した後に実行する必要があるいくつかの操作があります。

1)return amountニーズに割り当てられたにに比例して、の合計は、amountである。

2)return dateの場合は与えられた人のためのANYローンのために不足している、すべてのreturn_datesは空の文字列「」に変換する必要があります。

私はすでに私が比例戻し量を配分するために使用する機能があります。

def allocate_return_amount(group): 
    loan_amount = group['amount'] 
    return_amount = group['return_amount'] 
    sum_amount = loan_amount.sum() 
    sum_return_amount = return_amount.sum() 
    group['allocated_return_amount'] = (loan_amount/sum_amount) * sum_return_amount 
    return group 

を、私はそれを適用するためにgrouped_test_df = grouped_test_df.apply(allocate_return_amount)を使用しています。私は苦労しています何

は、もしそうなら、私は「」に、その人のために、すべてのreturn_datesを変え、人への融資のいずれかがreturn_dateが欠落しているかどうかをチェックする、実行する必要があり、かつ第2の動作です。

私はpandas documentationにGroupBy.allを見つけましたが、これを使った方法をまだ知りませんでしたか?

この例では、従うことが少し難しいかもしれませんので、ここではこの例のための私の理想的な出力があります:

ideal_test_df.head() 

    amount date  name return_amount return_date 
0 1000.0 2016-08-08 Jack 0.0    '' 
1 1500.0 2016-08-08 Jill 666.66   2017-08-08 
2 2000.0 2016-08-07 John 3000.0   2017-08-07 
3 2500.0 2016-08-08 Jack 0.0    '' 
4 2500.0 2016-08-08 Jill 1333.33   2017-08-08 

うまくいけば、これは理にかなっている、と助けるために時間を要する任意のパンダの専門家に事前にお願いします私はアウト!

+0

なぜ「return_amount」が「0」ですか? return_dateがないためですか? – Psidom

+0

はい、もっと重要なことは 'return_date'は空白になります。 'return_amount'も0に変わった場合は素晴らしいですが、私は' return_date'のロジックをベースにします。 – unpairestgood

答えて

2

その後、locを使用して、元のデータフレームに戻って設定し、anyを使用して、グループを反復処理条件をテストすることによって、それを行うことができます。

test_df = pd.DataFrame({'name': ['Jack','Jill','John','Jack','Jill'], 
        'date': ['2016-08-08','2016-08-08','2016-08-07','2016-08-08','2016-08-08'], 
        'amount': [1000.0,1500.0,2000.0,2000.0,3000.0], 
        'return_amount': [5000.0,2000.0,3000.0,0.0,0.0], 
        'return_date': ['2017-08-08','2017-08-08','2017-08-07','','2017-08-08']}) 

grouped = test_df.groupby('name') 

for name, group in grouped: 
    if any(group['return_date'] == ''): 
     test_df.loc[group.index,'return_date'] = '' 

そして、あなたはまた、return_amountをリセットしたい、とそうでない場合を追加のオーバーヘッドに気をつけて、すぐにこの行を追加してください:

test_df.loc[group.index, 'return_amount'] = 0 
+0

トリックをするようですね、ありがとう! – unpairestgood

関連する問題