【问题标题】:python - for loop to input multi dataframe to functionpython - for循环输入多个数据帧以发挥作用
【发布时间】:2018-12-09 02:40:40
【问题描述】:

原始数据集如下所示:

df.head()

id  name      level zone_id time
0   Light Rain  1   79      2018-01-01 08:00-10:00
1   Medium Rain 2   1       2018-01-02 09:00-14:00
2   Light Rain  1   79      2018-01-02 09:00-11:00
3   Medium Rain 2   1006    2018-01-01 08:00-09:00
4   Medium Rain 2   1       2018-01-03 10:00-13:00
5   Light Rain  1   1006    2018-01-03 22:00-0:00
6   Light Rain  1   1       2018-01-03 18:00-21:00

我想将每个 zone_id 分离到不同的数据框,然后清理它们。

我从另一个表中获取区域列表并获取:

 zone_list
['1006',
'79',
'1']

然后我使用for循环来获取多个数据帧

for i in zone_list:
    globals()['df_'+i] = df[df.zone_id == i]

然后我需要使用这样的函数来清理这些数据:

def clean_data(data):
    ...
    return data

我想要做的是将所有数据帧df_1,df_79等放入这个函数并输出多个数据帧。

到目前为止,如果我这样做 clean_data(df_1) 它可以完美运行。但我不知道如何为所有这些数据框创建一个循环。

我想要的是

df_79.head()

id  name      level zone_id time
0   Light Rain  1   79      2018-01-01 08:00
2   Light Rain  1   79      2018-01-02 09:00

df_1.head()

id  name      level zone_id time
1   Medium Rain 2   1       2018-01-02 09:00
4   Medium Rain 2   1       2018-01-03 10:00
6   Light Rain  1   1       2018-01-03 18:00

等等

我试图使用 dict 但仍然不知道。

谢谢大家!

【问题讨论】:

  • 您是否考虑过使用列表而不是以这种糟糕的方式设置全局变量?
  • 或者,直接在 pandas 中的普通groupby
  • list = [df_1,df_79] for x in list: x = clean_data(x) 但是这样不会改变x值吗?如果我检查 df_79,它仍然显示原件。 @MadPhysicist

标签: python list pandas function dictionary


【解决方案1】:

您可以使用字典来保存可变数量的变量。结合pd.DataFrame.groupby,您可以利用字典理解。例如:

dfs = {key: group.pipe(clean_data) for key, group in df.groupby('zone_id')}

pd.DataFrame.pipe 只是一种通过函数传递数据帧的方式,其格式有助于方法链接。

然后您可以通过dfs[79] 访问79 的数据框。我强烈建议您不要使用诸如df_79 之类的命名变量,因为这些变量很难跟踪和管理。另外,我建议你不要使用globals(),除非有特殊要求,这种情况很少发生。

【讨论】:

  • 这很有帮助!我仍然想知道如何将 dfs 提取到不同的数据帧中,因为我想将它们与另一个数据帧合并。
  • how to extract dfs into different dataframes: 我不确定你需要什么。但这似乎很简单,对于每个组,您可以使用dfs[group],例如dfs[79]dfs[1]dfs[1006]
  • 所以我的下一步是合并数据帧。 dfs[79].merge(cancels[79], left_on = 'date', right_on = 'date',how = 'inner')给我没有结果,但dfs[79].merge(cancel_79, left_on = 'date', right_on = 'date',how = 'inner') 已成功合并。如果我将cancels[79] 作为cancel_79 = cancel[cancel.zone == '79']的数据框@
  • @Yijia,我不知道cancels 长什么样,但可能超出了这个问题的范围(请随意ask a new one)。如果这个答案有帮助,请随时accept(左侧的绿色勾号)。
  • cancels = {key: group for key, group in cancel.groupby('zone_id')} 这是另一个同样按 zone_id 分组的数据框。是的,我想是的,我可能会问一个新的。仅供参考。
猜你喜欢
  • 2021-11-17
  • 2021-08-25
  • 2023-03-19
  • 2019-11-23
  • 1970-01-01
  • 2019-05-12
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多