如何解决如何计算一列中所有相同大小的重复值序列
我正在尝试将具有多个重复值的列转换为一个数据帧,该数据帧的每个唯一值都有一列,并且行计算发生相同大小的重复序列的次数。
例如:想象一个运动队的结果(胜利,平局,失败)。
results = np.array (['w','w','l','d','l'])
问题是团队一次获胜,连续两次获胜,连续三次获胜等等的次数。换句话说,请转换此DataFrame中的该列:
df_freq = pd.DataFrame ({'w': [1,3,1],'d': [3,2,0],'l': [3,1,0]},index = range (1,5))
注意:该序列仅按最高顺序计数(重复四次也不会重复两次)。
我尝试通过结合熊猫的内置功能(例如.groupby
.transform
.value_counts
来做到这一点,但只能通过循环来获取它并返回错误警告(“ A试图在DataFrame的切片副本上设置值“),也设置为NaN而不是零。
所以问题是我如何才能改进它,以便获得更快,更短的代码。 代码:
import pandas as pd
import numpy as np
results = np.array(['w','l'])
df = pd.DataFrame(results,columns =['results'])
list_results = df['results'].unique()
df_occ = pd.DataFrame(columns = list_results)
df['CumCount'] = df.groupby(['results']).cumcount()
for r in list_results:
df[r] = df['results'].eq(r)
df['end '+str(r)] = (df[r] == True) & (df[r].shift(-1) == False)
if (df[r].iloc[-1] == True):
df['end '+str(r)].iloc[-1] = True
df_occ[r] = pd.concat([df['CumCount'][df['end '+str(r)] == True].diff().fillna(df['CumCount']+1)],ignore_index = True)
max_occ = int(df_occ.max().max())
df_freq = pd.DataFrame(0,columns = list_results,index = np.arange(1,max_occ+1))
for r in list_results:
values = df_occ[r].value_counts(dropna=True).keys().tolist()
counts = df_occ[r].value_counts(dropna=True).tolist()
df_freq[r] = df_freq[r].index.map(dict(zip(values,counts)))
print(df_freq)
解决方法
使用2个groupbys进行此操作。第一组将连续事件分组。第二个获得那些频率。
s = pd.Series(results)
df = s.groupby(s.ne(s.shift()).cumsum()).agg(['size','first'])
df.groupby([*df]).size()
#size first
#1 d 3
# l 3
# w 1
#2 d 1
# l 2
# w 3
#4 w 1
或根据需要调整形状,并确保显示所有可能的尺寸:
(df.groupby([*df]).size().unstack(-1)
.reindex(range(1,df['size'].max()+1))
.rename_axis(None,axis=1))
# d l w
#size
#1 3.0 3.0 1.0
#2 1.0 2.0 3.0
#3 NaN NaN NaN
#4 NaN NaN 1.0
,
您可以利用itertools.groupby
的分组功能来构造每个连续键的元组key-len的列表。用它来构造一个数据框,并在此数据框上调用pivot_table
from itertools import groupby
arr = [(k,len(list(g))) for k,g in groupby(results)]
df_final = pd.DataFrame(arr).pivot_table(index=1,columns=0,aggfunc='size')
Out[271]:
0 d l w
1
1 3.0 3.0 1.0
2 1.0 2.0 3.0
4 NaN NaN 1.0
注意:如果您希望对所有3
或0
进行索引NaN
,只需像@ALollz解决方案那样链接其他reindex
。对于这一步,我将使用与他相同的reindex
,因此我不会将其写出来。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。