【问题标题】:Array ranges for columns in python pandaspython pandas中列的数组范围
【发布时间】:2017-12-13 13:39:29
【问题描述】:

我有一个三列数据集,格式如下

    t_stamp,Xval,Ytval
    0.000543,0,10
    0.000575,0,10
    0.041324,1,10
    0.041331,2,10
    0.041336,3,10
    0.04134,4,10
    0.041345,5,10
    0.04135,6,10
    0.041354,7,10


df = pd.read_csv('test.csv')

我只想运行前 3 行,我可以这样做

for i in range(1,4):
    df['X_t'+str(i)] = df['X'].shift(i)
X = df[['X', 'X_t1', 'X_t2', 'X_t3']].values

如果我想在 5 个范围内做,我可以像下面这样做

for i in range(1,6):
        df['X_t'+str(i)] = df['X'].shift(i)
    X = df[['X', 'X_t1', 'X_t2', 'X_t3', 'X_t4', 'X_t5']].values

但是,如果我们想在更高的范围内运行它,这不是有效的。我怎样才能实现自动化,这样我们就不必手动将 X 的值分配为 X = df[['X', 'X_t1', 'X_t2', 'X_t3']].values 假设我们要运行 1000 个范围?做X = df[['X', 'X_t1', 'X_t2', 'X_t3', 'X_t4', ..., 'X_1000']].values 效率不高。

【问题讨论】:

  • 几个问题:为什么需要内存中的移位数据?为什么你不能在飞行中做到这一点?为什么你认为这是非常低效的?这对我来说似乎是一个 XY 问题。
  • @MaxvonHippel,我不认为这是一个很好的重复,问题完全不同。这个问题虽然不清楚 IMO,但表明他们知道如何访问列切片。
  • @Mahsolid,我怀疑除了通信错误之外的任何事情。由于这个原因,StackOverflow 会阻止除非常有经验的用户(包括阻止我自己)以外的所有用户在没有达成共识的情况下关闭答案。
  • @AlexanderHuszagh 好的,感谢您澄清这一点。显然我对pandas 了解不够;在我个人更熟悉这项技术之前,我将避免标记 pandas 的帖子。 @Mahsolid 很抱歉给您带来不便。
  • @AlexanderHuszagh 是正确的,因此出于这个原因,SO 使用了共识设置。标记帖子不是滥用,它可以帮助 OP 找到解决问题的方法。在这种情况下,我错了,所以共识不是结束这个问题。您的代表不应该因此受到任何损害,其他人的也不应该受到损害。以后我会更加小心地标记pandas 帖子。当我标记帖子时,我通常没有错,标记通常是良好 SO 公民的一部分,所以请不要感到受到攻击或委屈。

标签: python arrays pandas numpy dataframe


【解决方案1】:

使用字典推导,构建列字典,创建临时数据框并提取其值:

In [1679]: pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).values
Out[1679]: 
array([[  0.,  nan,  nan,  nan,  nan],
       [  0.,   0.,  nan,  nan,  nan],
       [  1.,   0.,   0.,  nan,  nan],
       [  2.,   1.,   0.,   0.,  nan],
       [  3.,   2.,   1.,   0.,   0.],
       [  4.,   3.,   2.,   1.,   0.],
       [  5.,   4.,   3.,   2.,   1.],
       [  6.,   5.,   4.,   3.,   2.],
       [  7.,   6.,   5.,   4.,   3.]])

同样,

In [1680]: pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(10)}).values
Out[1680]: 
array([[  0.,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
       [  0.,   0.,  nan,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
       [  1.,   0.,   0.,  nan,  nan,  nan,  nan,  nan,  nan,  nan],
       [  2.,   1.,   0.,   0.,  nan,  nan,  nan,  nan,  nan,  nan],
       [  3.,   2.,   1.,   0.,   0.,  nan,  nan,  nan,  nan,  nan],
       [  4.,   3.,   2.,   1.,   0.,   0.,  nan,  nan,  nan,  nan],
       [  5.,   4.,   3.,   2.,   1.,   0.,   0.,  nan,  nan,  nan],
       [  6.,   5.,   4.,   3.,   2.,   1.,   0.,   0.,  nan,  nan],
       [  7.,   6.,   5.,   4.,   3.,   2.,   1.,   0.,   0.,  nan]])

range0 开始,因为df.shift(0) 只是X,你也想要。

如果要替换那些nan 值,可以先使用df.fillna(0),然后然后提取其值:

pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).fillna(0).values

或者,申请np.nan_to_num

pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).apply(np.nan_to_num, axis=0).values

或者,使用dropna,如果您对被截断的数据框没意见:

In [1763]: pd.DataFrame({ 'X_%d'%i : df['Xval'].shift(i) for i in range(5)}).dropna().values
Out[1763]: 
array([[ 3.,  2.,  1.,  0.,  0.],
       [ 4.,  3.,  2.,  1.,  0.],
       [ 5.,  4.,  3.,  2.,  1.],
       [ 6.,  5.,  4.,  3.,  2.],
       [ 7.,  6.,  5.,  4.,  3.]])

将此与第一个示例进行比较,所有带有nan 的行都被删除了。

【讨论】:

    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多