我有一个数据框,其中行索引和列标题应确定每个单元格的内容。我正在使用以下 df 的更大版本:

df = pd.DataFrame(index = ['afghijklde', 'afghijklmde', 'ade', 'afghilmde', 'amde'],
                  columns = ['ae', 'azde', 'afgle', 'arlde', 'afghijklbcmde'])

具体来说,我想应用自定义函数 edit_distance() 或等效函数(参见 here 函数代码)来计算两个字符串之间的差异分数。两个输入是行名和列名。以下工作但非常慢:
for seq in df.index:
    for seq2 in df.columns:
        df.loc[seq, seq2] = edit_distance(seq, seq2)

这产生了我想要的结果:
            ae  azde    afgle   arlde   afghijklbcmde
afghijklde  8    7        5       6          3
afghijklmde 9    8        6       7          2
ade         1    1        3       2          10
afghilmde   7    6        4       5          4
amde        2    1        3       2          9

有什么更好的方法可以做到这一点,也许使用 applymap() ?我用 applymap()applydf.iterrows() 尝试过的一切都返回了 AttributeError: "'float' object has no attribute 'index'" 类型的错误。谢谢。

最佳答案

事实证明,有一种更好的方法可以做到这一点。上面onepan的字典理解答案很好,但以随机顺序返回df索引和列。使用嵌套的 .apply() 以大致相同的速度完成相同的事情,并且不会改变行/列顺序。关键是不要纠结于首先命名 df 的行和列,然后再填充值。相反,反过来做,最初将 future 的索引和列视为独立的 Pandas 系列。

series_rows = pd.Series(['afghijklde', 'afghijklmde', 'ade', 'afghilmde', 'amde'])
series_cols = pd.Series(['ae', 'azde', 'afgle', 'arlde', 'afghijklbcmde'])

df = pd.DataFrame(series_rows.apply(lambda x: series_cols.apply(lambda y: edit_distance(x, y))))
df.index = series_rows
df.columns = series_cols

关于python - 根据索引和列名逐个单元填充整个数据框?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48915447/

10-12 22:47