【问题标题】:Convert 2D numpy.ndarray to pandas.DataFrame将 2D numpy.ndarray 转换为 pandas.DataFrame
【发布时间】:2014-08-11 18:10:50
【问题描述】:

我有一个很大的numpy.ndarray。它基本上是一个数组数组。我想将其转换为pandas.DataFrame。我想要做的是在下面的代码中

from pandas import DataFrame

cache1 = DataFrame([{'id1': 'ABC1234'}, {'id1': 'NCMN7838'}])
cache2 = DataFrame([{'id2': 3276827}, {'id2': 98567498}, {'id2': 38472837}])

ndarr = [[4.3, 5.6, 6.7], [3.2, 4.5, 2.1]]
arr = []
for idx, i in enumerate(ndarr):
    id1 = cache1.ix[idx].id1
    for idx2, val in enumerate(i):
        id2 = cache2.ix[idx2].id2
        if val > 0:
            arr.append(dict(id1=id1, id2=id2, value=val))
df = DataFrame(arr)
print(df.head())

我将外部数组和内部数组的索引映射到两个DataFrames 的索引以获取某些ID。 cache1cache2pandas.DataFrame。每个都有~100k 行。

这需要很长时间,比如几个小时才能完成。 有什么办法可以加快速度吗?

【问题讨论】:

  • 我照原样复制了代码。 cache1['A'] 是内部事物(基本上是缓存的键),所以可能令人困惑。我现在更正了。
  • cache2中的最后一个条目,不应该是{'id2': 38472837}而不是{'id': 38472837}吗?
  • @CTZhu:你几乎肯定是对的。
  • @DSM,在这种情况下,multiindex 可能是一种合适的方法,让我们看看 OP 怎么说。

标签: python-2.7 pandas multidimensional-array


【解决方案1】:

这样的事情应该可以工作:

ndarr = np.asarray(ndarr) # if ndarr is actually an array, skip this
fast_df = pd.DataFrame({"value": ndarr.ravel()})
i1, i2 = [i.ravel() for i in np.indices(ndarr.shape)]
fast_df["id1"] = cache1["id1"].loc[i1].values
fast_df["id2"] = cache2["id2"].loc[i2].values

给了

>>> fast_df
   value       id1       id2
0    4.3   ABC1234   3276827
1    5.6   ABC1234  98567498
2    6.7   ABC1234       NaN
3    3.2  NCMN7838   3276827
4    4.5  NCMN7838  98567498
5    2.1  NCMN7838       NaN

如果你真的想删除零值,你可以使用fast_df = fast_df[fast_df['value'] != 0]只保留非零值。

【讨论】:

    【解决方案2】:

    我怀疑你的ndarr,如果表示为二维np.array,总是有n,m的形状,其中ncache1.id1的长度,mcache2.id2的长度. cache2 中的最后一个条目应该是{'id2': 38472837} 而不是{'id': 38472837}。如果是这样,可能需要以下简单的解决方案:

    In [30]:
    
    df=pd.DataFrame(np.array(ndarr).ravel(),
                 index=pd.MultiIndex.from_product([cache1.id1.values, cache2.id2.values],names=['idx1', 'idx2']),
                 columns=['val'])
    In [33]:
    
    print df.reset_index()
           idx1      idx2  val
    0   ABC1234   3276827  4.3
    1   ABC1234  98567498  5.6
    2   ABC1234  38472837  6.7
    3  NCMN7838   3276827  3.2
    4  NCMN7838  98567498  4.5
    5  NCMN7838  38472837  2.1
    
    [6 rows x 3 columns]
    

    实际上,我也认为,保留MultiIndex 可能是一个更好的主意。

    【讨论】:

      猜你喜欢
      • 2020-07-06
      • 2017-08-14
      • 2014-10-01
      • 2016-04-12
      • 2018-06-07
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2022-06-27
      相关资源
      最近更新 更多