我有一个类似于以下列表的列表:
测试= [['abc','bcd','dce'],['abc','ab','cd'],['cd',be']]
我想获得每个子列表的每个唯一值的频率。例如,第一个子列表具有
abc 1
bcd 1
dce 1
抗体0
抗体0
光盘0
为0
我正在尝试以下内容:
def freq(list_):
df = []
for c in list_:
df_= pd.DataFrame.from_dict(Counter(c), orient = "index")
df_.index.name = 'motif'
df_.reset_index(inplace = True)
df.append(df_)
print(df_)
print(df)
df = reduce(lambda left,right: pd.merge(left,right,on=[0],
how='outer'), df).fillna('void')
df = df.T
df.columns = df.iloc[0]
df = df.iloc[1:]
df[df == "void"] = 0
col_names = sorted(df.columns)
df = df[col_names]
vals = df.values
sums = np.sum(vals, axis = 1)
freqs = vals / sums[:,None]
return pd.DataFrame(freqs).T
但这是行不通的。
我想要的输出是一个数据帧,每个唯一值作为列功能,每个子列表作为行。
如何才能做到这一点?
编辑:
所需的输出:
ab abc bcd be cd dce
0 0 .33 .33 0 0 .33
1 .33 .33 0 0 .33 0
2 0 0 0 .5 .5 0
最佳答案
由于标记了pandas
,因此pandas
get_dummies
有一种解决方案
pd.DataFrame(test).stack().str.get_dummies().sum(level=0)
Out[301]:
ab abc bcd be cd dce
0 0 1 1 0 0 1
1 1 1 0 0 1 0
2 0 0 0 1 1 0
更新
s=pd.DataFrame(test).stack().str.get_dummies().sum(level=0)
s.div(s.sum(1),0)
Out[312]:
ab abc bcd be cd dce
0 0.000000 0.333333 0.333333 0.0 0.000000 0.333333
1 0.333333 0.333333 0.000000 0.0 0.333333 0.000000
2 0.000000 0.000000 0.000000 0.5 0.500000 0.000000
关于python - 从列表列表创建唯一值的频率表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50818865/