根据索引和列名填充整个DataFrame单元格?

2024-09-29 22:25:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

具体来说,我想应用自定义函数edit_distance()或等效函数(函数代码请参见here),它计算两个字符串之间的差值。这两个输入是行和列的名称。以下操作有效,但速度非常慢:

^{pr2}$

这将产生我想要的结果:

            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'"类型的错误。谢谢。在


Tags: 数据函数dfindexadeaeapplymapafghilmde
2条回答

你可以使用理解功能,在我的电脑上它的速度可以提高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.

注:我使用此代码编辑_距离(您的链接中的第一个响应):

^{pr2}$

事实证明还有更好的方法。上面onepan的字典理解答案是好的,但是以随机顺序返回df索引和列。使用嵌套的.apply()可以以相同的速度完成相同的事情,并且不会改变行/列的顺序。关键是不要先为df的行和列命名,然后再填充值。相反,可以用另一种方法来做,首先将未来的索引和列作为独立的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

相关问题 更多 >

    热门问题