问题描述
我有一个包含日期和类别的熊猫数据框。对于相同的日期,可能有多个类别。 df示例:
+------------+----------+
| Date | Category |
+------------+----------+
| 2020-01-02 | A |
| 2020-01-02 | B |
| 2020-01-02 | C |
| 2020-01-02 | D |
| 2020-02-20 | E |
| 2020-02-20 | F |
| 2020-02-20 | G |
+------------+----------+
我想创建一个函数来为日期提供一个输出列表,为类别给另一个输出列表。
所需的输出:
date_list = [['2020-01-02'],['2020-02-20']]
category_list = [['A','B','C','D',],['E','F','G']]
请注意,可以有两个以上不同的日期,然后输出将相应地更改。
获得这样的输出的目的是,我必须将列表传递给API,该API会给我价格 每个类别。我只需创建一个列表即可
date_list = df.Date.tolist()
和
category_list = df.Category.tolist()
传递此类列表将对API进行多次调用,并且会花费很长时间。如果同一日期有相似的类别,那么我将传递一个日期列表和该日期的类别列表。看起来像
zipped = zip(category_list,date_list)
for i,j in zip:
result = get_data(i,j)
解决方法
首先按DataFrame.groupby
和GroupBy.agg
按组创建列表:
s = df.groupby('Date')['Category'].agg(list)
print (s)
Date
2020-01-02 [A,B,C,D]
2020-02-20 [E,F,G]
Name: Category,dtype: object
#for one element lists use lsit comprehension
date_list = [[x] for x in s.index]
category_list = s.tolist()
print (date_list)
[['2020-01-02'],['2020-02-20']]
print (category_list)
[['A','B','C','D'],['E','F','G']]
如果可能需要传递给函数,则可以通过Series s
通过Series.items
循环:
s = df.groupby('Date')['Category'].agg(list)
for i,j in s.items():
print ([i],j)
['2020-01-02'] ['A','D']
['2020-02-20'] ['E','G']