【问题标题】:Python - Pandas: How to add a series to each row in dataframePython - Pandas:如何为数据框中的每一行添加一个系列
【发布时间】:2017-03-09 09:51:28
【问题描述】:

我有这个数据框。

>>> print(df)
   a  b  c  d  e
0  z  z  z  z  z
1  z  z  z  z  y
2  z  z  z  x  y
3  z  z  w  x  y
4  z  v  w  x  y

我也有一个系列。

>>> print(map_class)
    class
0      -1
1       0
2       1
3       2
4       3
5       4
6       5
7       6
8       7
9       8
10      9
11     10

我的目标是将系列添加到数据框中的每一行。我想要的输出如下。

>>> print(result)
    a  b  c  d  e  class
0   z  z  z  z  z     -1
1   z  z  z  z  z      0
2   z  z  z  z  z      1
3   z  z  z  z  z      2
4   z  z  z  z  z      3
5   z  z  z  z  z      4
6   z  z  z  z  z      5
7   z  z  z  z  z      6
8   z  z  z  z  z      7
9   z  z  z  z  z      8
10  z  z  z  z  z      9
11  z  z  z  z  z     10
...
48  z  v  w  x  y     -1
49  z  v  w  x  y      0
50  z  v  w  x  y      1
51  z  v  w  x  y      2
52  z  v  w  x  y      3
53  z  v  w  x  y      4
54  z  v  w  x  y      5
55  z  v  w  x  y      6
56  z  v  w  x  y      7
57  z  v  w  x  y      8
58  z  v  w  x  y      9
59  z  v  w  x  y     10

目前我正在使用for 循环来执行此操作。但是,性能很差。还有其他方法可以做到这一点,但不使用for 循环?这是我当前的代码。

result = pd.DataFrame()

for i in range(len(df)):
    df_temp_multiple = pd.DataFrame()

    df_temp_single = df.iloc[i]

    df_temp_multiple = df_temp_multiple.append([df_temp_single]*len(map_class), ignore_index=True)
    df_temp_multiple = pd.concat([df_temp_multiple, map_class], axis=1)

    result = pd.concat([result, df_temp_multiple], ignore_index=True)

我的真实数据集非常庞大,超过 10Gb。因此,性能真的很重要。任何建议将不胜感激。谢谢!

【问题讨论】:

  • 我觉得需要numpy,所以加了tag。

标签: python-3.x pandas numpy


【解决方案1】:

这是一种使用 NumPy 创建输出数据的方法,特别是在其中使用 NumPy's advanced-indexing 并最终从该输出数据构造一个数据帧 -

m,n,r = df.shape[0], map_class.shape[0], df.shape[1]

out = np.empty((m,n,r+1),dtype=object)
out[:,:,:r] = df.values[:,None,:]
out[:,:,-1] = map_class.values[:,0]
col_names = list(df.columns) + list(map_class.columns)
df_out = pd.DataFrame(out.reshape(m*n,-1), columns=col_names)

运行时测试-

# Loopy version from the question
In [50]: %timeit func0(df, map_class)
100 loops, best of 3: 16 ms per loop

# Proposed one in this post
In [51]: %timeit func1(df, map_class)
10000 loops, best of 3: 152 µs per loop

In [52]: 16000.0/152
Out[52]: 105.26315789473684

100x+ 加快了样本数据的速度,希望也能很好地扩展到更大的数据集。

【讨论】:

  • 谢谢!这是一个很好的解决方案!你也描述得很好。再次,非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-27
  • 2013-10-05
  • 1970-01-01
  • 2022-12-11
  • 2017-10-09
  • 1970-01-01
相关资源
最近更新 更多