根据另一列的值修改pandas DataFrame的列值

7

我有一个数据框,其中有两列分别代表一个生物体。它们被称为ORG1和ORG2。我想将ORG2的值移动到相应索引值的ORG1中。

例如,如果ORG1是'A'而ORG2是'B',我希望ORG1从ORG2中获取值'B'。

我已经开始工作,以识别我想要移动的ORG2生物体的索引,如下所示:

def move_org2(x):
    org2_matches = Series(x.ORG2.str.count("ESBL"))
    return x.ix[org2_matches == 1]

org2_DF = move_org2(DF)

org2_DF.ORG2.index

如何最好地使用此方法,将ORG1值更改为对应ORG2索引处的值。

2个回答

18
In [13]: df
Out[13]:
  ORG1  ORG2
0    A  ESBL
1    B     P
2    C     Q
3    D     R
4    E  ESBL

In [14]: cond = df.ORG2 == 'ESBL'

In [15]: df.ORG1[cond] = df.ORG2[cond]

In [16]: df
Out[16]:
   ORG1  ORG2
0  ESBL  ESBL
1     B     P
2     C     Q
3     D     R
4  ESBL  ESBL

1
这给我一个“A value is trying to be set on a copy of a slice from a DataFrame”的警告。有什么解决办法吗? - Pablo

4
换句话说,使用.loc,您将执行以下操作:
In [2008]: df
Out[2008]:
  ORG1  ORG2
0    A  ESBL
1    B     P
2    C     Q
3    D     R
4    E  ESBL

In [2009]: df.loc[df['ORG2'] == 'ESBL', 'ORG1'] = df['ORG2']

In [2010]: df
Out[2010]:
   ORG1  ORG2
0  ESBL  ESBL
1     B     P
2     C     Q
3     D     R
4  ESBL  ESBL

或者,如果您需要一份不修改原始 df 的副本,则可以使用 .mask()

In [2016]: df.mask(df['ORG2'] == 'ESBL', df['ORG2'], axis=0)
Out[2016]:
   ORG1  ORG2
0  ESBL  ESBL
1     B     P
2     C     Q
3     D     R
4  ESBL  ESBL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接