【问题标题】:How to create a new data frame from a larger dataset如何从更大的数据集中创建新的数据框
【发布时间】:2022-01-11 09:02:33
【问题描述】:

我正在使用一个数据集(10000 个数据点),它提供 100 个不同的帐号以及交易金额、交易日期和时间等。

从这个数据集中,我想为一个帐号创建一个单独的数据框,然后包含该帐号全年进行的所有交易(按时间排序)。

我尝试这样做:

group = df.groupby('account_num')

然后给我

pandas.core.groupby.generic.DataFrameGroupBy

然后,当我想获取特定帐号的组时,例如 51234:

group.get_group('51234') 

我收到一个错误:

KeyError: 51234

如何制作一个单独的数据框,其中包含一个帐号的所有交易?

(对不起,如果这是一个非常基本的问题,我是新手)

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案1】:

    IIUC,您可以通过稍微不同的方式获得输出。您可以首先确保您的时间列(我假设它是基于您的描述的日期)实际上是一个 datetime 对象,然后为特定帐号过滤您的数据框 - 有很多方法可以做到这一点,a常见的是loc,但就我而言,我使用query。然后您可以使用sort_values 根据您的日期进行排序,最后您可以在日期列的年份部分使用groupby

    # Convert your date column to datetime
    df['date'] = pd.to_datetime(df['date'])
    
    # Filter and sort
    >>> print(df.query('account_num == 51234')\
        .sort_values(by=['date'],ascending=True))
    
    # Equivalently with loc  
    print(
          df.loc[df['account_num'] == 51234]\
        .sort_values(by=['date'],ascending=True))
      
        account_num       date
    0         51234 2020-01-01
    1         51234 2020-02-01
    2         51234 2020-03-01
    7         51234 2020-08-01
    9         51234 2020-08-01
    11        51234 2020-08-01
    13        51234 2020-08-01
    3         51234 2021-04-01
    4         51234 2021-05-01
    5         51234 2023-06-01
    6         51234 2023-07-01
    8         51234 2023-07-01
    10        51234 2023-07-01
    12        51234 2023-07-01
    
    # Filter, sort, and get yearly count
    >>> print(
          df.query('account_num == 51234')\
        .sort_values(by=['date'],ascending=True)\
            .groupby(df['date'].dt.year).account_num.count())
    
    date
    2020    7
    2021    2
    2023    5
    

    基于以下示例 DF:

    {'account_num': {0: 51234,
      1: 51234,
      2: 51234,
      3: 51234,
      4: 51234,
      5: 51234,
      6: 51234,
      7: 51234,
      8: 51234,
      9: 51234,
      10: 51234,
      11: 51234,
      12: 51234,
      13: 51234,
      14: 512346,
      15: 512346,
      16: 512346,
      17: 512346,
      18: 512346,
      19: 512346,
      20: 512346,
      21: 512346,
      22: 512346,
      23: 13123,
      24: 13123,
      25: 13123,
      26: 13123,
      27: 13123,
      28: 13123,
      29: 13123,
      30: 13123,
      31: 13123},
     'date': {0: '01/01/2020',
      1: '02/01/2020',
      2: '03/01/2020',
      3: '04/01/2021',
      4: '05/01/2021',
      5: '06/01/2023',
      6: '07/01/2023',
      7: '08/01/2020',
      8: '07/01/2023',
      9: '08/01/2020',
      10: '07/01/2023',
      11: '08/01/2020',
      12: '07/01/2023',
      13: '08/01/2020',
      14: '09/01/2020',
      15: '10/01/2020',
      16: '11/01/2020',
      17: '12/01/2020',
      18: '13/01/2020',
      19: '14/01/2020',
      20: '15/01/2020',
      21: '16/01/2020',
      22: '17/01/2020',
      23: '18/01/2020',
      24: '19/01/2020',
      25: '20/01/2020',
      26: '21/01/2020',
      27: '22/01/2020',
      28: '23/01/2020',
      29: '24/01/2020',
      30: '25/01/2020',
      31: '26/01/2020'}}
    

    【讨论】:

    • 谢谢,这成功了!出于好奇,如何使用 loc 做同样的事情?
    • 欢迎。您可以将代码的query 部分替换为df.loc[df['account_num'] == 51234]。我也更新了答案以将其反映为等效方式。如果有任何问题,请告诉我
    猜你喜欢
    • 2018-04-12
    • 2020-03-31
    • 2020-02-29
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 2016-11-19
    • 2019-05-11
    相关资源
    最近更新 更多