我有一个类似于以下列表的列表:

测试= [['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/

10-11 19:38
查看更多