[英]fill in entire dataframe cell by cell based on index AND column names?
我有一个数据框,其中行索引和列标题应确定每个单元格的内容。 我正在使用以下df的更大版本:
df = pd.DataFrame(index = ['afghijklde', 'afghijklmde', 'ade', 'afghilmde', 'amde'],
columns = ['ae', 'azde', 'afgle', 'arlde', 'afghijklbcmde'])
具体来说,我想应用自定义函数edit_distance()
或等效函数edit_distance()
有关函数代码,请参见此处 ),该函数计算两个字符串之间的差异得分。 两个输入是行名和列名。 以下工作正常,但速度非常慢:
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()
或apply
或df.iterrows()
尝试过的所有方法均返回了AttributeError: "'float' object has no attribute 'index'"
类型的错误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
您可以使用理解功能,在我的电脑上将其提高〜4.5倍
first = ['afghijklde', 'afghijklmde', 'ade', 'afghilmde', 'amde']
second = ['ae', 'azde', 'afgle', 'arlde', 'afghijklbcmde']
pd.DataFrame.from_dict({f:{s:edit_distance(f, s) for s in second} for f in first}, orient='index')
# output
# ae azde afgle arlde afghijklbcmde
# ade 1 2 2 2 2
# afghijklde 1 3 4 4 9
# afghijklmde 1 3 4 4 10
# afghilmde 1 3 4 4 8
# amde 1 3 3 3 3
# this matches to edit_distance('ae', 'afghijklde') == 8, e.g.
注意,我将此代码用于edit_distance(您的链接中的第一个响应):
def edit_distance(s1, s2):
if len(s1) > len(s2):
s1, s2 = s2, s1
distances = range(len(s1) + 1)
for i2, c2 in enumerate(s2):
distances_ = [i2+1]
for i1, c1 in enumerate(s1):
if c1 == c2:
distances_.append(distances[i1])
else:
distances_.append(1 + min((distances[i1], distances[i1 + 1], distances_[-1])))
distances = distances_
return distances[-1]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.