【问题标题】:How to split pandas dataframe into list of dataframes by id?如何按 id 将 pandas 数据框拆分为数据框列表?
【发布时间】:2021-05-12 07:52:38
【问题描述】:

我有一个大熊猫数据框(大约 150000 行)。我试过方法 groupby('id') 但返回组元组。我只需要一个数据帧列表,然后我将它们转换为 np 数组批次以放入自动编码器(就像这个 https://www.datacamp.com/community/tutorials/autoencoder-keras-tutorial 但 1D)

所以我有一个熊猫数据集:

data = {'Name': ['Tom', 'Joseph', 'Krish', 'John', 'John', 'John', 'John', 'Krish'], 'Age': [20, 21, 19, 18, 18, 18, 18, 18],'id': [1, 1, 2, 2, 3, 3, 3, 3]}  
# Create DataFrame  
df = pd.DataFrame(data)  
# Print the output.  
df.head(10)

我需要相同的输出(只是 pandas 数据框的列表)。另外,我需要一个未排序列表的列表,这很重要,因为它的时间序列。

data1 = {'Name': ['Tom', 'Joseph'], 'Age': [20, 21],'id': [1, 1]}  
data2 = {'Name': ['Krish', 'John', ], 'Age': [19, 18, ],'id': [2, 2]}  
data3 = {'Name': ['John', 'John', 'John', 'Krish'], 'Age': [18, 18, 18, 18],'id': [3, 3, 3, 3]}  
pd_1 = pd.DataFrame(data1)
pd_2 = pd.DataFrame(data2)
pd_3 = pd.DataFrame(data3)
array_list = [pd_1,pd_2,pd_3]
array_list

如何拆分数据框?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    或者你可以试试:

    array_list = df.groupby(df.id.values).agg(list).to_dict('records')
    

    Output:

    [{'Name': ['Tom', 'Joseph'], 'Age': [20, 21], 'id': [1, 1]},
     {'Name': ['Krish', 'John'], 'Age': [19, 18], 'id': [2, 2]},
     {'Name': ['John', 'John', 'John', 'Krish'],
      'Age': [18, 18, 18, 18],
      'id': [3, 3, 3, 3]}]
    

    UPDATE:

    如果需要数据框列表:

    df_list = [g for _,g in df.groupby('id')]
    #OR
    df_list = [pd.DataFrame(i) for i in df.groupby(df.id.values).agg(list).to_dict('records')]
    

    重置每个数据帧的索引:

    df_list = [g.reset_index(drop=True) for _,g in df.groupby('id')]
    

    【讨论】:

    • to_dict("records")groupby("id")
    • 抱歉,我需要熊猫数据框列表,而不是字典列表。我改变了问题....怎么做?
    【解决方案2】:

    让我们在 id 上使用 group 并使用带有方向 listto_dict 按照 id 准备记录

    [g.to_dict('list') for _, g in df.groupby('id', sort=False)]
    

    [{'Name': ['Tom', 'Joseph'], 'Age': [20, 21], 'id': [1, 1]},
     {'Name': ['Krish', 'John'], 'Age': [19, 18], 'id': [2, 2]},
     {'Name': ['John', 'John', 'John', 'Krish'], 'Age': [18, 18, 18, 18], 'id': [3, 3, 3, 3]}]
    

    【讨论】:

    • 抱歉,我需要熊猫数据框列表,而不是字典列表。我改变了问题....怎么做?
    • @СеменНемытов 检查[g.reset_index(drop=True) for _, g in df.groupby('id', sort=False)]
    【解决方案3】:

    我不确定您的需求,但这样的方法对您有用吗?

    df = df.set_index("id")
    [df.loc[i].to_dict("list") for i in df.index.unique()]
    

    或者如果您真的想将索引保留在列表中:

    [df.query(f"id == {i}").to_dict("list") for i in df.id.unique()]
    

    【讨论】:

    • 抱歉,我需要熊猫数据框列表,而不是字典列表。我改变了问题....怎么做? ——
    【解决方案4】:

    如果您想创建新的 DataFrame 来存储值:

    (如果你想创建一个列表,以前的答案更相关) 这可以通过使用 for 循环遍历每个 id 并在每个循环中创建一个新数据帧来解决。 我将您推荐给#40498463 和其他答案以了解groupby() 函数的用法。请注意,我已将 id 列的名称更改为 Id。

    for Id, df in df.groupby("Id"):
        str1 = "df"
        str2 = str(Id)
        new_name = str1 + str2
        exec('{} = pd.DataFrame(df)'.format(new_name))
    

    输出:

    df1
         Name  Age  Id
    0     Tom   20   1
    1  Joseph   21   1
    
    df2
        Name  Age  Id
    2  Krish   19   2
    3   John   18   2
    
    df3
        Name  Age  Id
    4   John   18   3
    5   John   18   3
    6   John   18   3
    7  Krish   18   3
    

    【讨论】:

    • 抱歉,我需要熊猫数据框列表,而不是字典列表。我改变了问题....
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2022-12-22
    • 2020-10-01
    • 1970-01-01
    相关资源
    最近更新 更多