我有一个数据框,其中行索引和列标题应确定每个单元格的内容。我正在使用以下df的更大版本:
df = pd.DataFrame(index = ['afghijklde', 'afghijklmde', 'ade', 'afghilmde', 'amde'],
columns = ['ae', 'azde', 'afgle', 'arlde', 'afghijklbcmde'])
Run Code Online (Sandbox Code Playgroud)
具体来说,我想应用自定义函数edit_distance()或等效函数(有关函数代码,请参见此处),该函数计算两个字符串之间的差异得分。两个输入是行名和列名。以下工作正常,但速度非常慢:
for seq in df.index:
for seq2 in df.columns:
df.loc[seq, seq2] = edit_distance(seq, seq2)
Run Code Online (Sandbox Code Playgroud)
这产生了我想要的结果:
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
Run Code Online (Sandbox Code Playgroud)
有什么更好的方法(也许使用applymap()?)呢?一切我已经试过applymap()或apply或df.iterrows()返回的那种错误AttributeError: "'float' object has no attribute 'index'"。谢谢。
事实证明,还有一种更好的方法可以做到这一点。上面的onepan字典理解答案很好,但是以随机顺序返回df索引和列。使用嵌套.apply()可以以相同的速度完成相同的操作,并且不会更改行/列的顺序。关键是不要挂断先命名df的行和列,然后再填充值。取而代之的是,将未来的索引和列视为独立的熊猫系列。
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1789 次 |
| 最近记录: |