如何在pandas df列中删除和移位值

时间:2018-06-01 02:00:20

标签: python pandas merge del

我有一个pandas df,我想操纵它,所以它是有序的。因此,对于下面的df,我希望订购['I']。因此,数值将为10-50。我有2个选项可以做到这一点;

1)尝试删除列['G']['H']中的值。因此,如果值为== X,则删除。

2)尝试在== X

时合并相同列中的值
import pandas as pd

d = pd.DataFrame({
        'J' : [10,'B','C','C',50],
        'I' : ['B',20,30,40,'C'],
        'H' : ['X','A','C','B','X'],         
        'G' : ['X', 'B', 'A','B','X'],                                 
        })

输出:

   G  H   I   J
0  X  X   B  10
1  B  A  20   B
2  A  C  30   C
3  B  B  40   C
4  X  X   C  50

选项1是我们从X删除Column H,预期输出为:

   G  H   I   J
0  X  B  10
1  B  A  20   B
2  A  C  30   C
3  B  B  40   C
4  X  C  50

选项2是我们在X的{​​{1}}上合并,目标输出是:

Column G-H

我玩过 G H I J 0 XX B 10 1 B A 20 B 2 A C 30 C 3 B B 40 C 4 XX C 50 ,但这会删除整行。

4 个答案:

答案 0 :(得分:4)

选项1:

您可以使用向左移动符合条件df.H == 'X'的行:

使用以下变量定义:

hij = ['H', 'I', 'J']
x = df.H=='X'

我们可以简明扼要地写出班次。

df.loc[x, hij] = df.loc[x, hij].apply(lambda x: x.shift(-1), axis=1)
outputs:
    G   H   I   J
0   X   B   10  NaN
1   B   A   20  B
2   A   C   30  C
3   B   B   40  C
4   X   C   50  NaN

选项2:

同样的原则,但需要两个陈述。

我们可以将H联合到G

df.loc[x, 'G'] = df.loc[x, 'G'] + df.loc[x, 'H']
# df.loc[x, 'G'] = df.loc[x, ['G, 'H']].sum(axis=1)
# or df.loc[x, ['G', 'H']].apply(np.sum, axis=1)
# or df.loc[x, 'G'] = df.loc[x, ['G', 'H']].apply(lambda x: (x + x.shift(-1))[0], axis=1)

并按选项1中的方式移动

df.loc[x, hij] = df.loc[x, hij].apply(lambda x: x.shift(-1), axis=1)
final output:
    G   H   I   J
0   XX  B   10  NaN
1   B   A   20  B
2   A   C   30  C
3   B   B   40  C
4   XX  C   50  NaN

答案 1 :(得分:4)

如果GH列中Xd = pd.DataFrame({ 'J' : [10,'B','C','C',50, 60], 'I' : ['B',20,30,40,'C', 'D'], 'H' : ['X','A','C','B','X', 'Y'], 'G' : ['Y', 'B', 'A','B','X', 'X'], }, columns=list('GHIJ')) print (d) G H I J 0 Y X B 10 1 B A 20 B 2 A C 30 C 3 B B 40 C 4 X X C 50 5 X Y D 60 ,那么更一般的解决方案应该是更改条件,然后按条件合并在一起并shift

m = d[['G','H']].eq('X').any(axis=1)
print (m)

0     True
1    False
2    False
3    False
4     True
5     True
dtype: bool

d['H'] = d['G'] + d['H'] 
d[m] = d[m].shift(-1, axis=1)
print (d)
    G   H   I    J
0  YX   B  10  NaN
1   B  BA  20    B
2   A  AC  30    C
3   B  BB  40    C
4  XX   C  50  NaN
5  XY   D  60  NaN 
$_currentHealth

答案 2 :(得分:3)

对于你的第一个问题,请更换' X'作为np.nan,然后对数据帧进行排序(移位值)

d.replace({'H':{'X':np.nan}}).apply(lambda x: sorted(x, key=pd.isnull),1).fillna('')
Out[234]:
   G  H   I  J
0  X  B  10
1  B  A  20  B
2  A  C  30  C
3  B  B  40  C
4  X  C  50

对于问题二:首先使用np.where创建d.G,然后我们就像上面那样做

d.G=np.where((d.G=='X')&(d.H=='X'),'XX',d.G)

d.replace({'H':{'X':np.nan}}).apply(lambda x: sorted(x, key=pd.isnull),1).fillna('')


Out[242]: 
    G  H   I  J
0  XX  B  10   
1   B  A  20  B
2   A  C  30  C
3   B  B  40  C
4  XX  C  50   

答案 3 :(得分:3)

你可以去np.whereshift

ndf = pd.DataFrame(np.where((d['H']=='X')[:,None],
                       d.assign(H=d.H+d.G).shift(-1,axis=1), #only d.shift(...) in case you dont want to add  
                       d), columns=d.columns)

    G  H   I    J
0  XX  B  10  NaN
1   B  A  20    B
2   A  C  30    C
3   B  B  40    C
4  XX  C  50  NaN