1

ここではかなり初心者レベルのパンダの質問です。

トランザクションの DataFrame があります。

Customer  Date      Amount 
Angus  2009-07-18   $76.46 
Bruno  2009-07-21   $68.66 
Danno  2009-07-25   $73.52 
Chapp  2009-07-11   $56.04 
Chapp  2009-07-21   $11.30 
Frank  2009-07-07   $52.86 
Chapp  2009-07-09   $97.82 
Danno  2009-07-11   $84.98 
(etc. for thousands of lines)

このデータから 4 つの DataFrame を作成したいと思います。

  1. 顧客ごとに、顧客の名前、行ったトランザクションの数、およびこれらのトランザクションの金額の合計
  2. 顧客ごとに、最新の取引の日付と金額。
  3. 各顧客の最初の取引の日付と金額。
  4. 各顧客について、最大の (金額に関する) 取引の日付と金額。

適切なコードについて教えていただけますか?

(「なぜ DataFrame を使うのですか? これには ThnargLopes を使用する必要があります!」というような回答を歓迎します。)

4

2 に答える 2

0

OK、私はこれを理解しました。まず、合計する 1 のトランザクション フィールドを作成します。

df["Trans"] = len(df)*[1]

顧客ごとにグループ化します。

cust_gp = df.groupby("Customer")

最初のものは最も簡単です:

cust_gp.sum()

4 つも難しくありません。

cust_gp.max()

2 と 3 はトリッキーでした... テスト データで動作するように見える解決策を見つけました。Customer と Date でデータを並べ替え、Customer ごとに最初のものを取得して集計します。

df.sort(["Customer","Date"]).groupby("Customer").first()
df.sort(["Customer","Date"]).groupby("Customer").last()

...しかし、ビッグ データ セットで実行したところ、最近のトランザクションの一部が最後のトランザクションの前に発生したと言われました。これは意味がありません。

日付フィールドがテキストとしてインポートされていることが判明しました! したがって、完全なソリューション:

df.Date = pd.to_datetime(df.Date)  # Date field should be date, not text
df = df.sort(["Customer","Date"]) 
cust_gp = df.groupby("Customer")

total_df     = cust_gp.sum()   # 1
largest_df   = cust_gp.max()   # 2
first_df     = cust_gp.first() # 3
last_df      = cust_gp.last()  # 4

私はこれに満足しています。ただし、「Gifts」列は、最も洗練された方法で実装されていないと確信しています。

于 2013-08-09T15:22:10.650 に答える
0

DataFrameaはデータの優れた構造だと思います。「分割 - 適用 - 結合」一連の分析ステップを設定するときはいつでもPandas優れています。Series顧客が 1 人しかいないと仮定して、探しているようなものを返す関数を作成できます。

import pandas as pd
def trans_count(DF):
    return pd.Series({'count': len(DF),
                     'total': sum(DF['Amount'])})

次に、およびを使用groupbyapplyます。

yourDF.groupby('Customer').apply(trans_count)

ただし、それぞれの新規DataFramesは 1 人の顧客の概要であるため、目的の結果をすべて 1 つのSeries.

私の電話からテストされていません!

于 2013-08-08T21:21:24.867 に答える