微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我可以在这里应用矢量化吗?还是我应该换个角度思考?

如何解决我可以在这里应用矢量化吗?还是我应该换个角度思考?

简单地说,我有一年中给定月份发生的活动行。我想在此活动之间添加其他不活动的行,同时将月份值重置为一个序列。例如,如果我有2、5、7个月,我需要将它们映射到1、4、7,而我的非活动月份是2、3、5和6。因此,我必须添加四行这种不活动。我已经使用字典和for循环完成了此操作,但是我知道这样做效率不高,尤其是当我将其移至数千行数据进行处理时。关于如何优化此的任何建议?我是否需要以其他方式考虑数据格式?我有一个建议,要列出列表,然后将其移到最后的数据框中,但是我看不到那里有什么好处。我对NumPy不够了解,无法弄清楚如何使用矢量化进行此操作,因为这非常快,而且学习一些新知识真是太棒了。以下是我的代码以及执行的步骤:

df = pd.DataFrame({'col1': ['A','A','B','C','C'],'col2': ['X','Y','X','Z','Y'],'col3': [1,8,2,5,7,6,7]})

输出

  col1 col2  col3
0    A    X     1
1    A    Y     8
2    B    X     2
3    B    Y     5
4    B    Z     7
5    C    Y     6
6    C    Y     7

我正在创建一个字典来处理for循环:

df1 = df.groupby('col1')['col3'].apply(list).to_dict()
df2 = df.groupby('col1')['col2'].apply(list).to_dict()
max_num = max(df.col3)

输出

{'A': [1,8],'B': [2,7],'C': [6,7]}
{'A': ['X','B': ['X','Z'],'C': ['Y','Y']}
8

现在我通过创建一个新的数据框,使用字典添加这些行:

df_new = pd.DataFrame({'col1': [],'col2': [],'col3': []})
for key in df1.keys():
    k = 1
    if list(df1[key])[-1] - list(df1[key])[0] + 1 < max_num:
        for i in list(range(list(df1[key])[0],list(df1[key])[-1] + 1,1)):
            if i in df1[key]:
                df_new = df_new.append({'col1': key,'col2': list(df2[key])[list(df1[key]).index(i)],'col3': str(k)},ignore_index=True)
            else:
                df_new = df_new.append({'col1': key,'col2': 'N',ignore_index=True)
            k += 1
        df_new = df_new.append({'col1': key,'col2': 'E',ignore_index=True)
    else:
        for i in list(range(list(df1[key])[0],ignore_index=True)
            k += 1

输出

   col1 col2 col3
0     A    X    1
1     A    N    2
2     A    N    3
3     A    N    4
4     A    N    5
5     A    N    6
6     A    N    7
7     A    Y    8
8     B    X    1
9     B    N    2
10    B    N    3
11    B    Y    4
12    B    N    5
13    B    Z    6
14    B    E    7
15    C    Y    1
16    C    Y    2
17    C    E    3

然后转到所需的表单:

df_pivot = df_new.pivot(index='col1',columns='col3',values='col2')

输出

col3    1   2   3   4   5   6   7   8
col1                                
A   X   N   N   N   N   N   N   Y
B   X   N   N   Y   N   Z   E   NaN
C   Y   Y   E   NaN NaN NaN NaN NaN

感谢您的帮助。

解决方法

我们可以用下面的语句代替创建和使用字典的步骤,该语句利用reindex放置了附加值-z "-config replacer.full_list\(0\).description=auth1 \ -config replacer.full_list\(0\).enabled=true \ -config replacer.full_list\(0\).matchtype=REQ_HEADER \ -config replacer.full_list\(0\).matchstr=Authorization \ -config replacer.full_list\(0\).regex=false \ -config replacer.full_list\(0\).replacement="" N,而没有明确的循环。

E

此后,您可以按原样应用df_new = df.set_index('col3')\ .groupby('col1')\ .apply(lambda dg: dg.drop('col1',1) .reindex(range(dg.index.min(),dg.index.max()+1),fill_value='N') .reindex(range(dg.index.min(),min(max_num,dg.index.max()+1)+1),fill_value='E') .set_index(pd.RangeIndex(1,dg.index.max()-dg.index.min()+1+1)+1,name='col3')) )\ .reset_index() 语句。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。