【问题标题】:Splitting data frame into smaller data frames based on unique column values根据唯一列值将数据框拆分为更小的数据框
【发布时间】:2021-11-30 22:48:24
【问题描述】:

这是我的数据框:

    Quantity     Code         Value       
0       1757     08951201     717.0
1       1100     08A85800       0.0
2       2500     08A85800       0.0
3        323     08951201       0.0
4        800     08A85800       0.0

我如何将其拆分为基于代码列创建的较小数据框。 (例如,这个应该分成带有所有 08951201 代码的 df1 和带有 08A85800 的 df2)

编辑: 在我将执行一些值计算之后,我很想有一种方法将它们以相同的顺序合并回原始数据帧。

【问题讨论】:

  • 你为什么要合并回来?你可以保存原来的...
  • 您应该阅读split-apply-combine 文档;)

标签: python pandas dataframe


【解决方案1】:

按照建议,您可以在数据框上使用 groupby() 以按一列名称值分隔:

import pandas as pd

cols = ['Quantity', 'Code', 'Value']
data = [[1757,     '08951201',     717.0],
 [1100,     '08A85800',       0.0],
 [2500,     '08A85800',       0.0],
 [323,    '08951201',      0.0],
 [800,    '08A85800',       0.0]]

df = pd.DataFrame(data, columns=cols)

groups =df.groupby(['Code'])

然后您可以通过groups.indices 恢复索引,这将返回一个以“代码”值作为键、索引作为值的字典。最后,如果您想获取每个子数据帧,您可以调用group_list = list(groups)。我建议分两步完成工作(首先分组,然后调用列表),因为这样你可以通过 groupDataframe 调用其他方法 (group)


编辑

如果你想要一个特定的数据框,你可以调用

 df_i = group_list[i][1]

group_list[i] 是子数据帧的第 i 个元素,但它是一个包含 (group_val,group_df) 的元组。其中group_val 是与此新数据帧关联的值('08951201''08A85800'),group_df 是新数据帧。

【讨论】:

  • 恐怕我不太明白。我需要单独的数据框,但它的输出是一个列表(?)
  • group_list = list(groups) 是一个列表,然后您可以调用 group_list[0] 这是第一个子数据框,group_list[1] 是第二个子数据框,因此(在您的示例中,您将只有 2 个,但是,如果您有更多代码,那么您将拥有更多)
  • print(type(group_list[1])) 给我<class 'tuple'>
  • 对不起,你必须打电话给group_list[0][1](第一个索引是组号,第二个是元组中DF的顺序)。元组中的第一个元素是关联的代码值,第二个是数据帧
  • 对不起,我不得不下线。无论如何,非常感谢您的宝贵时间。这正是我所需要的,10/10 答案。
【解决方案2】:

使用groupby 并应用您的自定义函数来处理您的子数据框:

groups = df.groupby('Code')
print(list(groups))

# Output:
[('08951201',    Quantity      Code  Value
0      1757  08951201  717.0
3       323  08951201    0.0),

('08A85800',    Quantity      Code  Value
1      1100  08A85800    0.0
2      2500  08A85800    0.0
4       800  08A85800    0.0)]

现在假设你想通过Valuesum

>>> df.groupby('Code')['Value'].sum()
Code
08951201    717.0
08A85800      0.0
Name: Value, dtype: float64

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-25
    • 1970-01-01
    • 2020-10-01
    相关资源
    最近更新 更多