通过将for循环替换为pandas操作来提高代码效率

2024-06-01 14:13:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我还在学习使用numpy和熊猫

我有以下数据帧:

df = pd.DataFrame({'arrival_time':[1,1,1,3,3,5,2,4,6,2],'id_col':[4,10,5,1,7,8,2,3,6,9],'col1':[1,7,4,6,8,6,89,9,10,30],'col2':['a','r','d','t','d','k','e','a','r','d']})
  • 到达时间:物品到达的时间(多个物品可以同时到达)

  • id\u col:项目的唯一id。id分配与到达时间无关

  • col1、col2:数据帧中的其他列

df:

{1:    arrival_time  id_col  col1 col2
0             1       4     1    a
1             1      10     7    r
2             1       5     4    d, 
2:    arrival_time  id_col  col1 col2
6             2       2    89    e
9             2       9    30    d, 
3:    arrival_time  id_col  col1 col2
3             3       1     6    t
4             3       7     8    d, 
4:    arrival_time  id_col  col1 col2
7             4       3     9    a, 
5:    arrival_time  id_col  col1 col2
5             5       8     6    k, 
6:    arrival_time  id_col  col1 col2
8             6       6    10    r}

现在我使用这段代码来获取到达时间df,也就是说,df行具有相同的到达时间

time_unique = df.arrival_time.unique()
arrival_dict = dict()
for t in time_unique :
    arrival_dict[t] = df[df.arrival_time == t]

是否可以使用pandas.apply()或.map()函数来改进这一点

预期的字典如下所示:

{1:    arrival_time  id_col  col1 col2
 0             1       1     1    a
 1             1       2     7    r
 2             1       3     4    d,
 3:    arrival_time  id_col  col1 col2
 3             3       4     6    t
 4             3       5     8    d,
 5:    arrival_time  id_col  col1 col2
 5             5       6     6    k,
 2:    arrival_time  id_col  col1 col2
 6             2       7    89    e
 9             2      10    30    d,
 4:    arrival_time  id_col  col1 col2
 7             4       8     9    a,
 6:    arrival_time  id_col  col1 col2
 8             6       9    10    r}

提前谢谢


Tags: 数据numpyiddataframedftime时间col
1条回答
网友
1楼 · 发布于 2024-06-01 14:13:42

如@anky在评论中提到的:

dict(iter(df.groupby(df['arrival_time'])))

输出:

{1:    arrival_time  id_col  col1 col2
0             1       4     1    a
1             1      10     7    r
2             1       5     4    d, 
2:    arrival_time  id_col  col1 col2
6             2       2    89    e
9             2       9    30    d, 
3:    arrival_time  id_col  col1 col2
3             3       1     6    t
4             3       7     8    d, 
4:    arrival_time  id_col  col1 col2
7             4       3     9    a, 
5:    arrival_time  id_col  col1 col2
5             5       8     6    k, 
6:    arrival_time  id_col  col1 col2
8             6       6    10    r}

与^{的比较

def m1(df):
  time_unique = df.arrival_time.unique()
  arrival_dict = dict()
  for t in time_unique :
    arrival_dict[t] = df[df.arrival_time == t]
  return arrival_dict

def m2(df):
  return dict(iter(df.groupby(df['arrival_time'])))

in_ = [pd.concat([df]*n) for n in [1,10,100,1000]]

看起来熊猫的解决方案更快

enter image description here

相关问题 更多 >