迭代两个数据帧的行

时间:2017-11-21 19:36:47

标签: python pandas numpy

我有两个数据帧让我们先调用一个df,第二个调用compare_df: 第一个是这样的:

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]

第二个是这样的:

Date         cell         tumor_size
19/10/2015    564           [47, 23, 56]
19/10/2015    123           [56, 11, 23]
22/10/2014    345           [36, 66, 78]
13/12/2013    456           [44, 21, 83]

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

# 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个值。有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您的错误在于尝试从大小为parser.h的{​​{1}}(pd.Series)中减去compare_df.tumor_size大尺寸(list)。从row.tumor_size中减去list / tuple时,pd.Series会尝试匹配两个序列并减去每两个匹配的行。但是,当pandaslist大小不同时,它不知道如何匹配,并引发异常。

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

apply

当然,提前将所有列表转换为compare_df.tumor_size.apply( lambda compare_size: np.array(compare_size) - np.array(row.tumor_size) ) 可能会有所帮助。

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

np.array

compare_df.tumor_size.apply( lambda compare_size: [compare_size[i] - row.tumor_size[i] for i in range(3)] ) (可能稍早),您会收到不同的错误消息:

pandas 0.21.0

在这种情况下,有一个更简单的解决方案 - 只需将列表转换为TypeError: unsupported operand type(s) for -: 'list' and 'list' ,它将像魔术一样工作

np.array

对我来说,这项工作包含compare_df.tumor_size - np.array(row.tumor_size) pandas==0.21.0

相关问题