我是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'])
现在设置一个变量,例如:
n = 3
目标是将列添加到df,由前n个值的数组组成,如下所示:
下一步可能是将NaN设置为零。
有没有聪明的方法来做到这一点?
提前感谢您的帮助,
吉尔伯特
答案 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=1
来apply
行func
,这是必需的,因为我们希望使用通过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]