【问题标题】:How do I "save" groups from DataFrame.groupby to separate variables?如何将 DataFrame.groupby 中的组“保存”到单独的变量中?
【发布时间】:2020-10-21 12:17:17
【问题描述】:

我有一个带有 WhatsApp 消息的 DataFrame,发件人.groupbyed。我可以以某种方式将整个 DataFrame 或仅一个 Series 拆分并保存到单独的变量中吗?

假设我有发件人 A、B、C。我能否获得 3 个新数据帧,分别只有发件人 A、B、C 或只有一列的发件人曾经是 A、B 或 C 的系列?

【问题讨论】:

  • 您能否展示如何从数据中构建数据框的代码?
  • dfa, dfb, dfc = [_, s for s in df.groupby('sender')]
  • @mounaim 你是什么意思?
  • df.groupby 是一个可迭代对象。这个迭代的结构是(index, data_frame)。这意味着如果你执行for i in df.groupby(...): print I,你会看到一个有两个位置的元组。第一个是索引,第二个是按该索引分组的子数据帧。 index 这里将是您分组的任何内容。因此,如果您的 df 包含三个发件人(例如 Mike、John 和 Paul),list(df.groupby('sender')) 将返回类似 [(Mike, df_mike), (John, df_john), (Paul, df_paul)] 的内容。当您执行for (_, s) in df.groupby 时,您会自动将Mike 分配给变量_
  • df_make to the variable s). It is a convention in python to use _`(下划线)每当不使用变量时,这就是我这样做的原因。

标签: python pandas dataframe pandas-groupby series


【解决方案1】:

据我所知,您不能在没有明确定义的情况下在迭代中动态创建新变量。例如:

for sender in senders:
    df_{sender} = df[df["sender"] == sender]

因此,如果您想将DataFrame 拆分为多个变量,则必须“硬编码”您的解决方案,其中定义了所有变量。例如。通过df_A = df[df["sender"] == "A"] 等。我建议您使用df.groupby("sender"),然后使用适当的计算/转换,因为您将要执行的对象一次只包含一个发件人。

如果您想将多个 DataFrame 保存为 CSV 文件,每个发件人一个,您可以尝试:

df.groupby("sender").apply(lambda x: x.to_csv(f"sub_df_{x.name}.csv"))

x.name 是df 所在的索引,所以在这种情况下对应的发送者。

【讨论】:

  • 后续问题:我想这样做,这样我就可以获得消息在一天中的时间分布的单独直方图。您是否偶然熟悉 seaborn,并且知道我是否可以在不分离 df 的情况下实现这一目标?
  • 我不建议在 apply 函数中使用to_csv
  • @Marcus, “...您不能在迭代中动态创建新变量” — 标准方法是使用列表或字典,例如。 G。取而代之的是名称df_Adf_Bdf_C 使用df_['A']df_['B']df_['C'],其中df_ 是一个字典。
  • @1tr3mm3l7 我知道你可以在不分离 df 的情况下实现它,尽管我对 seaborn 不够熟悉,无法给你确切的说明。你也许可以在这里找到一些灵感? scentellegher.github.io/programming/2017/07/15/…
  • @rafaelc 你能扩展一下吗?如果用例涉及根据列中的唯一值保存大量 CSV 文件,为什么不使用 .groupby(col).apply(save_df)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2018-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多