【问题标题】:How to split a dataframe based on column values, sort or groupby for string values?如何根据列值拆分数据框,对字符串值进行排序或分组?
【发布时间】:2018-04-06 16:16:33
【问题描述】:

对编码和 pandas 完全陌生。

df

   Date         Particulars    Inwards  Code

1 2017-04-01         EFG           12800    01
2 2017-07-22         ABC           100      01
3 2017-09-05         BCD           10000    01
4 2018-03-13         ABC           2000     01

我想根据df['Particulars'] 列从这个df 输出3 个数据帧,即

输出: df1

   Date         Particulars    Inwards  Code

2 2017-07-22         ABC           100      01
4 2018-03-13         ABC           2000     01

df2

   Date         Particulars    Inwards  Code

1 2017-04-01         EFG           12800    01

df3

   Date         Particulars    Inwards  Code

3 2017-09-05         BCD           10000    01

我有办法通过:

 df1 = df1.append(df.loc[df['Particulars'] == 'ABC'], ignore_index=False)

当我初始化Particulars 列表并制作数据帧,然后使用for loop 执行上述命令时。但我想知道sortgroupby 是否会是更好的选择?以及如何应用它们我尝试了groupbysort,但无法获取数据框。

【问题讨论】:

  • 在这种情况下你可以这样做:df1 = df[df['Particulars'] == 'ABC']等等。
  • @pault 我试图避免将“详细信息”中的唯一项目列表作为 1000 行 df,然后在列表中设置空数据框(制作字典),然后循环遍历. :( 我希望有一种方法可以拆分基于数据框的“详细信息”列
  • [y for x ,y in df.groupby('Particulars')]

标签: python pandas dataframe pandas-groupby


【解决方案1】:

您可以通过在 Particulars 上对 df 进行分组来创建数据框字典。

d = {index: label for index, label in df.groupby('Particulars')}

现在您可以使用

访问每个 df
d['ABC']

    Date        Particulars Inwards Code
2   2017-07-22  ABC         100     1
4   2018-03-13  ABC         2000    1

【讨论】:

  • 很好,我忘了这个。一个问题,不过。调用groupby 是否自动意味着它是 O(n log n),因为它在后台通过排序创建组?我似乎记得是这样的。
  • @jpp,包括 LC 在内的循环复杂度为 O(n),不确定分组是否会进一步影响它。是时候进一步了解了:)
【解决方案2】:

字典理解是构建数据的最简洁方式:

d = {k: df[df['Particulars'] == k] for k in df['Particulars'].unique()}

相关:How do I create a variable number of variables?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 2022-07-19
    • 1970-01-01
    • 2020-06-18
    • 1970-01-01
    相关资源
    最近更新 更多