如何解决我可以在这里应用矢量化吗?还是我应该换个角度思考?
简单地说,我有一年中给定月份发生的活动行。我想在此活动之间添加其他不活动的行,同时将月份值重置为一个序列。例如,如果我有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 举报,一经查实,本站将立刻删除。