Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在数据数组中查找索引值并转换为数据帧?_Python_Pandas_Numpy - Fatal编程技术网

Python 如何在数据数组中查找索引值并转换为数据帧?

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

我有一个由cKDTree创建的
ndarray
,如下所示:

idx = array([[2941, 4837, 3593],
             [ 323, 3209, 3649]])
我想用它来创建一个pandas
DataFrame
,使用它们作为另一个数据帧的索引,该数据帧具有一些其他符号,例如:

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
by
Series
,但如果值是唯一的,那么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