我想分析项目的序列项目以及项目出现的序列中的位置。
例如:
dataframe['sequence_list'][0] = ['a','b', 'f', 'e']
dataframe['sequence_list'][1] = ['a','c', 'd', 'e']
dataframe['sequence_list'][2] = ['a','d']
...
dataframe['sequence_list'][i] = ['a','b', 'c']
我想要得到的是: “ a”出现在列表的位置0、1、2、3多少次? “ b”出现在列表的位置0、1、2、3多少次? ...
输出如下:
output[1,'a'] = 4
output[2,'a'] = 0
output[3,'a'] = 0
output[4,'a'] = 0
output[1,'b'] = 2
...
输出格式可能不同。我只想告诉您是否有任何快速矩阵计算方法可以帮助我快速获取统计信息?
答案 0 :(得分:2)
Setup
使用设置
df = pd.DataFrame({'col': [['a','b', 'f', 'e'], ['a','c', 'd', 'e'], ['a','d'], ['a','b', 'c']]})
col
0 [a, b, f, e]
1 [a, c, d, e]
2 [a, d]
3 [a, b, c]
您可以apply
+ Counter
pd.DataFrame(df.col.tolist()).apply(Counter)
产生
0 {'a': 4}
1 {'b': 2, 'c': 1, 'd': 1}
2 {'f': 1, 'd': 1, None: 1, 'c': 1}
3 {'e': 2, None: 2}
dtype: object
每个索引的。
您可以按照需要的方式解析数据,例如立即填写您的字典,以添加零或不建议的情况,如果是None
。
答案 1 :(得分:2)
首先使用两个语句之一将列表转换为Series:
df_ser = dataframe.sequence_list.apply(pd.Series)
df_ser = pd.DataFrame(dataframe.sequence_list.tolist()) # ~30% faster?
新数据框的列是每一行的项目位置:
# 0 1 2 3
#0 a b f e
#1 a c d e
#2 a d NaN NaN
#3 a b c NaN
将列号转换为第二级索引,然后将第二级索引转换为其自身的列:
df_col = df_ser.stack().reset_index(level=1)
# level_1 0
#0 0 a
#0 1 b
#0 2 f
#....
计算组合数。这是你的答案:
output = df_col.groupby(['level_1', 0]).size()
#level_1 0
#0 a 4
#1 b 2
# c 1
# d 1
#2 c 1
# d 1
# f 1
#3 e 2
您可以将其作为字典:
output.to_dict()
#{(0, 'a'): 4, (1, 'b'): 2, (1, 'c'): 1, (1, 'd'): 1,
# (2, 'c'): 1, (2, 'd'): 1, (2, 'f'): 1, (3, 'e'): 2}
全部一行:
dataframe.sequence_list.apply(pd.Series)\
.stack().reset_index(level=1)\
.groupby(['level_1',0]).size().to_dict()