使用以下列表和数据框,我想迭代日期列表,并为列表和数据框中的每个日期创建一个新的数据框。
列表:
['12/12/2017', '12/13/2017', '12/14/2017']
dataframe:
source time date
0 a 8:00 12/12/2017
1 b 9:00 12/13/2017
2 c 8:30 12/12/2017
3 b 8:05 12/14/2017
4 a 8:10 12/13/2017
5 a 8:15 12/12/2017
期望的输出:
source time date
0 a 8:00 12/12/2017
2 c 8:30 12/12/2017
5 a 8:15 12/12/2017
......等等每个日期。
代码:
import pandas as pd
unique_dates=['12/12/2017','12/13/2017','12/14/2017']
data=[['a','8:00','12/12/2017'],['b','9:00','12/13/2017'],['c','8:30','12/12/2017'],
['b','8:05','12/14/2017'],['a','8:10','12/13/2017'],['a','8:15','12/12/2017']]
headers=['source','time','date']
df=pd.DataFrame(data,columns=headers)
for item in unique_dates:
if item in df:
new_df=df[df['date']==item]
print(new_df)
这给了我没有输出。我不知道如何做到这一点,任何帮助都会受到赞赏。
答案 0 :(得分:2)
一旦您将其识别为groupby
操作的良好用例,解决此问题就变得简单了。您需要做的就是使用isin
进行预过滤,然后进行分组和迭代。
df_list = [g for _, g in df[df.date.isin(unique_dates)].groupby('date')]
如果您想要按日期索引字典,请在dict
对象上调用groupby
-
df_dict = dict(list(df[df.date.isin(unique_dates)].groupby('date')))
或者,使用字典理解 -
df_dict = {i : g for i, g in df[df.date.isin(unique_dates)].groupby('date')}
print(*df_list, sep='\n\n')
source time date
0 a 8:00 12/12/2017
2 c 8:30 12/12/2017
5 a 8:15 12/12/2017
source time date
1 b 9:00 12/13/2017
4 a 8:10 12/13/2017
source time date
3 b 8:05 12/14/2017