1

私が Pandas でやろうとしている SQL と Excel で通常行うことはたくさんあります。ここにはいくつかの異なるラングリングの問題があり、それらはすべて同じ目標を持っているため、1 つの質問にまとめられています。

Python に 3 つの列を持つデータ フレーム df があります。

   |  EventID  |  PictureID  |  Date
0  |  1        |  A          |  2010-01-01
1  |  2        |  A          |  2010-02-01
2  |  3        |  A          |  2010-02-15
3  |  4        |  B          |  2010-01-01
4  |  5        |  C          |  2010-02-01
5  |  6        |  C          |  2010-02-15

EventID は一意です。PictureID は一意ではありませんが、PictureID + Date は異なります。

I. まず、新しい列を追加します。

df['period'] = the month and year that the event falls into beginning 2010-01.

Ⅱ.次に、データを、特定の期間内の特定の PictureID のイベント数をカウントする新しいデータフレームに「溶解」したいと考えています。ピリオドが 2 つだけの例を使用します。

   |  PictureID  |  Period  | Count
0  |  A          |  2010-01 | 1
1  |  A          |  2010-02 | 2
2  |  B          |  2010-01 | 1
3  |  C          |  2010-02 | 2

次に、この新しいデータ フレームを、すべての一意の PictureID の期間カウントを提供するものにスタック (?) できるようにします。

   |  PictureID  |  2010-01 | 2010-02
0  |  A          |  1       | 2
1  |  B          |  1       | 0
2  |  C          |  0       | 2

私の感覚では、パンダはこの種のことを簡単に行えるように作られていますが、それは正しいですか?

[編集: 混乱した 3 番目の部分を削除しました。]

4

1 に答える 1

2

最初の 2 つの部分では、次のことができます。

>>> df['Period'] = df['Date'].map(lambda d: d.strftime('%Y-%m'))
>>> df
   EventID PictureID                Date   Period
0        1         A 2010-01-01 00:00:00  2010-01
1        2         A 2010-02-01 00:00:00  2010-02
2        3         A 2010-02-15 00:00:00  2010-02
3        4         B 2010-01-01 00:00:00  2010-01
4        5         C 2010-02-01 00:00:00  2010-02
5        6         C 2010-02-15 00:00:00  2010-02
>>> grouped = df[['Period', 'PictureID']].groupby('Period')
>>> grouped['PictureID'].value_counts().unstack(0).fillna(0)
Period  2010-01  2010-02
A             1        2
B             1        0
C             0        2

3番目の部分については、質問をよく理解していないか、例に正しい数字を投稿していません。3 行目の のカウントはA2 になるはずなので? 6 行目のCは 1 である必要があります。期間が 6 か月の場合は...

いずれにしても、次のようにする必要があります。

>>> ts = df.set_index('Date')
>>> ts.resample('6M', ...)

更新:これはかなり醜い方法です。より良い方法を見たと思いますが、SOの質問が見つかりません。でも、これで仕事も捗る…

def for_half_year(row, data):
    date = row['Date']
    pid = row['PictureID']
    # Do this 6 month checking better
    if '__start' not in data or (date - data['__start']).days > 6*30:
        # Reset values
        for key in data:
            data[key] = 0
        data['__start'] = date
    data[pid] = data.get(pid, -1) + 1
    return data[pid]

df['PastSix'] = df.apply(for_half_year, args=({},), axis=1)
于 2013-09-14T22:52:53.477 に答える