如果你想留在你可以扔掉纯大熊猫在一个棘手的groupby
和apply
,如果你不计算列重命名,它最终会沸腾到一个班轮。
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
既然目标是采取列的值(在这种情况下,日期),并重复你打算从想熊猫索引是非常有用的列表创建多行的所有值。
我们希望日期成为新行的单个索引,因此我们使用groupby
将所需的行值放入索引中。然后在该操作中,我想只将这个日期分割成这个日期,这是apply
会为我们做的。
我传递一个apply
大熊猫Series
它由一个单独的列表,但我可以通过.values[0]
其推动Series
的唯一行与单个项的数组访问列表。
要将列表转换为一组将返回索引日期的行,我可以将其设置为DataFrame
。这招致了额外索引的惩罚,但我们最终放弃了这一点。我们可以将其作为一个索引本身,但是这会阻止重复值。
一旦这个传回去,我有一个多索引,但我可以强制这个行我们希望的行格式reset_index
。然后我们简单地删除不需要的索引。
这听起来很复杂,但实际上我们只是利用熊猫函数的自然行为来避免明确的迭代或循环。
速度明智这往往是相当不错的,因为它依靠apply
任何并行技巧与apply
一起工作在这里。
可选,如果你希望它是稳健的多个日期每一个嵌套列表:
df_new = df.groupby('date').ts.apply(lambda x: pd.DataFrame([item for sublist in x.values for item in sublist]))
此时一个衬垫越来越密集,你应该扔到功能。
你是如何创建数据框的,以便在TimeStamps列中获取列表? – ari 2015-02-10 21:45:30
这就是csv发送给我的方式。这是从quickbooks导出的数据文件。 – 2015-02-10 21:47:06