Python 如何在数据数组中查找索引值并转换为数据帧?
我有一个由cKDTree创建的Python 如何在数据数组中查找索引值并转换为数据帧?,python,pandas,numpy,Python,Pandas,Numpy,我有一个由cKDTree创建的ndarray,如下所示: idx = array([[2941, 4837, 3593], [ 323, 3209, 3649]]) 我想用它来创建一个pandasDataFrame,使用它们作为另一个数据帧的索引,该数据帧具有一些其他符号,例如: 2941, A 4837, B 3593, C 323, D 3209, E 3649, F 并且,使用类似于gdf=pd.DataFrame(idx)的东西,我想要一个DataFram
ndarray
,如下所示:
idx = array([[2941, 4837, 3593],
[ 323, 3209, 3649]])
我想用它来创建一个pandasDataFrame
,使用它们作为另一个数据帧的索引,该数据帧具有一些其他符号,例如:
2941, A
4837, B
3593, C
323, D
3209, E
3649, F
并且,使用类似于gdf=pd.DataFrame(idx)
的东西,我想要一个DataFrame
idx_0 idx_1 idx_2
0 A B C
1 D E F
而不是
idx_0 idx_1 idx_2
0 2941 4837 3593
1 323 3209 3649
如何使用多维数组实现这一点df.loc[idx]
不起作用。您可以使用:
输出
0 1 2
0 A B C
1 D E F
假设df
为:
0 1
0 2941 A
1 4837 B
2 3593 C
3 323 D
4 3209 E
5 3649 F
另一种选择是,假设idx
是一个numpy数组,您可以使用映射,然后构建数据帧:
result = pd.DataFrame(np.vectorize(lookup.get)(idx))
与apply
一起用于DataFrame的所有列
:
s = df.set_index('a')['b']
print (s)
a
2941 A
4837 B
3593 C
323 D
3209 E
3649 F
Name: b, dtype: object
idx = np.array([[2941, 4837, 3593],
[ 323, 3209, 3649]])
gdf = pd.DataFrame(idx).apply(lambda x: x.map(s))
print (gdf)
0 1 2
0 A B C
1 D E F
对于映射,dict会更好。那就直接用地图吧@jezrael@Vishnudev-是的,这要看情况而定,我认为如果第一列中的值重复,则返回错误的序列更好,如果转换为dict,则没有错误(所以不知道数据是否有问题)。所以一般来说,我认为按序列映射更好,只要总是唯一的索引(这里的第一列),那么按dict映射也是好的。我推测OP给出的索引是唯一的。有道理@jezrael@Vishnudev-Yop,仅解释我为什么使用
map
bySeries
,但如果值是唯一的,那么dict也是一个很好的解决方案。
s = df.set_index('a')['b']
print (s)
a
2941 A
4837 B
3593 C
323 D
3209 E
3649 F
Name: b, dtype: object
idx = np.array([[2941, 4837, 3593],
[ 323, 3209, 3649]])
gdf = pd.DataFrame(idx).apply(lambda x: x.map(s))
print (gdf)
0 1 2
0 A B C
1 D E F