gpt4 book ai didi

python - 在 Pandas DataFrame 中拆分列表

转载 作者:太空狗 更新时间:2023-10-29 18:19:56 25 4
gpt4 key购买 nike

我有一个包含许多列的 csv 文件。使用 pandas,我将这个 csv 文件读入数据框,并有一个日期时间索引和五六个其他列。

其中一列是时间戳列表(下面的示例带有索引)

CreateDate     TimeStamps
4/1/11 [Timestamp('2012-02-29 00:00:00'), Timestamp('2012-03-31 00:00:00'), Timestamp('2012-04-25 00:00:00'), Timestamp('2012-06-30 00:00:00')]
4/2/11 [Timestamp('2014-01-31 00:00:00')]
6/8/11 [Timestamp('2012-08-31 00:00:00'), Timestamp('2012-09-30 00:00:00'), Timestamp('2012-11-07 00:00:00'), Timestamp('2013-01-10 00:00:00'), Timestamp('2013-07-25 00:00:00')]

我想做的是将时间戳列转换为列出的每个时间戳的单独行。例如,对于第 1 行,它将转换为 4 行,而第 2 行将转换为 1 行。我意识到我需要重置索引才能执行此操作,这很好。

我尝试过的一切最终都进入了左字段(获取值并在 pandas 之外创建一个列表等)

任何建议表示赞赏。

最佳答案

如果你想留在纯 pandas 中,你可以加入一个棘手的 groupbyapply 如果你不计算列重命名。

In [1]: import pandas as pd

In [2]: d = {'date': ['4/1/11', '4/2/11'], 'ts': [[pd.Timestamp('2012-02-29 00:00:00'), pd.Timestamp('2012-03-31 00:00:00'), pd.Timestamp('2012-04-25 00:00:00'), pd.Timestamp('2012-06-30 00:00:00')], [pd.Timestamp('2014-01-31 00:00:00')]]}

In [3]: df = pd.DataFrame(d)

In [4]: df.head()
Out[4]:
date ts
0 4/1/11 [2012-02-29 00:00:00, 2012-03-31 00:00:00, 201...
1 4/2/11 [2014-01-31 00:00:00]

In [5]: df_new = df.groupby('date').ts.apply(lambda x: pd.DataFrame(x.values[0])).reset_index().drop('level_1', axis = 1)

In [6]: df_new.columns = ['date','ts']

In [7]: df_new.head()
Out[7]:
date ts
0 4/1/11 2012-02-29
1 4/1/11 2012-03-31
2 4/1/11 2012-04-25
3 4/1/11 2012-06-30
4 4/2/11 2014-01-31

由于目标是获取列的值(在本例中为日期)并针对您打算从列表中创建的多行的所有值重复它,因此考虑 pandas 索引很有用。

我们希望日期成为新行的单一索引,因此我们使用 groupby 将所需的行值放入索引中。然后在该操作中,我只想拆分这个日期的列表,这就是 apply 将为我们做的。

我正在传递 apply 一个由单个列表组成的 pandas Series 但我可以通过 .values[0] 访问该列表> 将 Series 的唯一行推送到具有单个条目的数组。

要将列表转换为一组行,这些行将传递回索引日期,我可以将其设为 DataFrame。这会导致选择额外索引的惩罚,但我们最终放弃了它。我们可以将其作为索引本身,但这会排除重复值。

一旦传回,我就有了一个多索引,但我可以通过 reset_index 将其强制转换为我们想要的行格式。然后我们简单地删除不需要的索引。

这听起来很复杂,但实际上我们只是利用 pandas 函数的自然行为来避免显式迭代或循环。

在速度方面,这往往是相当不错的,因为它依赖于 apply 任何与 apply 一起工作的并行化技巧在这里工作。

如果您希望它对每个具有嵌套列表的多个日期具有鲁棒性,则可选:

df_new = df.groupby('date').ts.apply(lambda x: pd.DataFrame([item for sublist in x.values for item in sublist]))

在这一点上,一个衬里变得越来越密集,你可能应该投入一个功能。

关于python - 在 Pandas DataFrame 中拆分列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28442358/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com