如何将列添加到由另一列的前n个值的数组组成的Pandas数据帧中?

时间:2016-06-22 12:18:50

标签: python arrays pandas dataframe

我是python和pandas的新手。我不知道如何以优雅的方式解决以下问题

假设我们有一个简单的pandas数据帧。

import numpy as np
import pandas as pd
from pandas import DataFrame, Series
df = pd.DataFrame(np.arange(0,60,10), columns=['Value'])

A very simple pandas dataframe

现在设置一个变量,例如:

n = 3

目标是将列添加到df,由前n个值的数组组成,如下所示:

pandas dataframe with a columns made of arrays

下一步可能是将NaN设置为零。

有没有聪明的方法来做到这一点?

提前感谢您的帮助,

吉尔伯特

2 个答案:

答案 0 :(得分:1)

我们可以使用df.shift生成偏移列和列表理解,然后将它们组合在一起map,为{{1}生成list lists }}。但是,生成的dataframe生成的list在将其分配给原始lists之前需要首先进行转置,以便我们有一个与正确行对应的值列表。

df

输入:

df["b"] =np.array(map(list,[df["a"].shift(x) for x in range(1,4)])).T.tolist()

输出:

   a
0  1
1  2
2  3
3  4

答案 1 :(得分:1)

这有点粗糙,但以下是有效的:

In [63]:
def func(x):
    return pd.Series(df['Value'], index=np.arange(x.name-3,x.name)).values.tolist()
df['ArrayValues'] = df[['Value']].apply(lambda x: func(x), axis=1)
df
​
Out[63]:
   Value       ArrayValues
0      0   [nan, nan, nan]
1     10   [nan, nan, 0.0]
2     20  [nan, 0.0, 10.0]
3     30       [0, 10, 20]
4     40      [10, 20, 30]
5     50      [20, 30, 40]

首先我们使用[[]]对df进行双下标,以便我们将单列强制为df,这样我们就可以调用apply并使用param axis=1applyfunc,这是必需的,因为我们希望使用通过name属性访问的当前行索引值,根据索引范围返回重新索引的Series作为索引值不存在它为不存在的索引行创建NaN值,最后我们需要通过返回一个numpy数组来匿名化数据并将其转换为列表,这样我们就不会#39 ; t尝试对齐系列索引

修改

如果我们将开始/停止参数交换为np.arange并采取否定步骤,那么您将获得所需的订单:

In [70]:
def func(x):
    return pd.Series(df['Value'], index=np.arange(x.name-1,x.name-4,-1)).values.tolist()
df['ArrayValues'] = df[['Value']].apply(lambda x: func(x), axis=1)
df
​
Out[70]:
   Value       ArrayValues
0      0   [nan, nan, nan]
1     10   [0.0, nan, nan]
2     20  [10.0, 0.0, nan]
3     30       [20, 10, 0]
4     40      [30, 20, 10]
5     50      [40, 30, 20]