在数据框中添加两个元素(基于索引)

问题描述 投票:1回答:1

我有一个数据帧,其中一些行除了一个变量外没用。我想将那些行中的变量添加到上一行,然后删除无用的行。

在数据框中有一些行,其中唯一有用的信息是在变量上,所以我想保留这些信息。更准确地说,我的数据框看起来像

|cat1| cat2|var1|var2|
|A   |x    |1   |2   |
|A   |x    |1   |0   |
|A   |x    |.   |5   |
|A   |y    |1   |2   |
|A   |y    |1   |2   |
|A   |y    |1   |3   |
|A   |y    |.   |6   |
|B   |x    |1   |2   |
|B   |x    |1   |4   |
|B   |x    |1   |2   |
|B   |x    |1   |1   |
|B   |x    |.   |3   |

而且我想得到

|cat1| cat2|var1|var2|
|A   |x    |1   |2     |
|A   |x    |1   |5(5+0)|
|A   |y    |1   |2     |
|A   |y    |1   |2     |
|A   |y    |1   |9(6+3)|
|B   |x    |1   |2     |
|B   |x    |1   |4     |
|B   |x    |1   |2     |
|B   |x    |1   |4(3+1)|

我试过像

test = df[df['var1'] == '.'].index
for num in test:
    df['var2][num - 1] = df['var2][num - 1] + df['var2][num] 

但它不起作用。

任何帮助,将不胜感激。

pandas dataframe indexing
1个回答
1
投票

对于一个非常易读的解决方案,组合np.where来选择shiftvar1包含.的行。使用-1选择下一行。如果是这种情况,请添加下一行,否则只需填充原始行。之后,只需用.删除所有行

df['var2_new'] = np.where(df['var1'].shift(-1) == '.', 
                          df['var2'] + df['var2'].shift(-1), df['var2'])
df[df['var1'] != '.']
#   cat1 cat2 var1  var2  var2_new
#0     A    x    1     2       2.0
#1     A    x    1     0       5.0
#3     A    y    1     2       2.0
#4     A    y    1     2       2.0
#5     A    y    1     3       9.0
#7     B    x    1     2       2.0
#8     B    x    1     4       4.0
#9     B    x    1     2       2.0
#10    B    x    1     1       4.0
© www.soinside.com 2019 - 2024. All rights reserved.