我有两个数据帧让我们先调用一个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
个值。有什么想法吗?
答案 0 :(得分:2)
您的错误在于尝试从大小为parser.h
的{{1}}(pd.Series
)中减去compare_df.tumor_size
大尺寸(list
)。从row.tumor_size
中减去list
/ tuple
时,pd.Series
会尝试匹配两个序列并减去每两个匹配的行。但是,当pandas
和list
大小不同时,它不知道如何匹配,并引发异常。
从错误代码判断,您的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
。