如何使用熊猫获得所需的输出: 将行转换为列表列
输入格式:
col1 col2 col3 col4
1 a r1 2019-10-10
1 a r2 2019-10-11
1 a r3 2019-10-12
2 b r4 2019-10-08
2 b r5 2019-10-09
所需的输出:
col1 col2 col4 new_column
1 a 2019-10-10 []
1 a 2019-10-11 [r1]
1 a 2019-10-12 [r1,r2]
2 b 2019-10-08 []
2 b 2019-10-09 [r4]
答案 0 :(得分:1)
我认为应该做的工作! (假设您的日期列的类型为datetime而不是字符串):
dictionary = df.groupby(by=['col1','col2']).apply(lambda df2: df2[['col3', 'col4']].to_dict('index')).to_dict()
def my_func(col1_value, col2_value, my_date, my_dictionary):
df_bis = pd.DataFrame.from_dict(my_dictionary[(col1_value, col2_value)], orient='index')
return df_bis[df_bis['col4'] < my_date].col3.to_list()
df['new_col'] = df.apply(lambda row: my_func(row.col1, row.col2, row.col4, dictionary),
axis = 1)
答案 1 :(得分:0)
@Hugues GALLIER,您做了一个很好的技巧,将数据帧复制到字典中,然后使用新的数据帧为相关键(col1,col2组合)重新创建它,然后按条件对其进行过滤。
@Sunny Kumar,我感谢您提出这个问题,因为我了解到将列表对象保存在数据框中会失去幕后矢量化工作的力量。因此保存为字符串通常更好,使用时可以解释为numpy数组。
我的解决方案执行相同的操作,但是使用数据帧的副本(而不是字典副本),我认为它更简单:
df_temp = df.copy()
def prep_list(col1,col2,col4,df):
return df[(df.col1==col1) & (df.col2==col2) & (df.col4 < col4)].col3.to_list()
df['new_column'] = df.apply(lambda row: prep_list(row.col1,row.col2,row.col4,df_temp), axis=1)