迭代两个数据帧的行

2024-09-20 04:07:31 发布

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

我有两个数据帧,让我们称第一个数据帧为df,第二个数据帧为compare-fu: 第一个是这样的:

Date         cell         tumor_size (assume it is three dimensional)
25/10/2015    113           [51, 52, 55]
22/10/2015    222           [50, 68, 22]
22/10/2015    883           [45, 23, 67]
20/10/2015    334           [35, 23, 76]

第二个是这样的:

^{pr2}$

对于数据帧中的每一行,我要遍历第二个数据帧中的每一行,记录欧几里德距离,然后得到最小值。这是我的代码试图实现这一点:

# These will be our lists of pairs and size differences.
pairs = []
diffs = []


for row in df.itertuples():
     compare_df['distance'] = np.linalg.norm(compare_df.tumor_size - row.tumor_size) # I get error for this line
     row_of_interest = compare_df.loc[compare_df.distance == compare_df.distance.min()]
     pairs.append(row_of_interest.cell.values[0])
     diffs.append(row_of_interest.distance.values[0])

df['most_similar_to'] = pairs
df['similarity'] = diffs

但是我得到:

ValueError: Length of values does not match length of index

虽然向量的大小是相同的,但是我删除了Nan值。有什么想法吗?在


Tags: of数据dfforsizecellrowdistance
1条回答
网友
1楼 · 发布于 2024-09-20 04:07:31

你的错误是试图从三号(row.tumor_size)的pd.Series中减去大尺寸(compare_df.tumor_size)。当从pd.Series中减去list/tuple时,pandas尝试匹配两个序列并减去每两个匹配的行。但是,当list和{}大小不同时,它不知道如何匹配,并引发异常。在

从错误代码判断,您的pandas版本可能有点旧。您可以尝试使用apply强制逐行使用减法运算符:

compare_df.tumor_size.apply(
    lambda compare_size: np.array(compare_size) - np.array(row.tumor_size)
)

当然,提前将所有列表转换为np.array可能会有好处。在

如果您不喜欢np.array,可以使用:

^{pr2}$

pandas 0.21.0中(也许更早一点),您会得到一个不同的错误消息:

^{3}$

在这种情况下,有一个更简单的解决方案-只需将列表转换为np.array,它将像魔术一样工作

compare_df.tumor_size -  np.array(row.tumor_size)

对我来说,这是与pandas==0.21.0numpy==1.13.3一起工作的。在

相关问题 更多 >