根据Pandas DataFram中的其他列值在列之间移动行值

2024-09-28 21:36:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫的数据框架,上面有一个有机体名称和抗生素敏感性的列表。我希望根据以下规则将所有有机体合并到下面的数据框中的一列中。在

  1. 如果ORG1==A,则不执行任何操作;

  2. 如果ORG1!=A和ORG2==A,将ORG2值移到ORG1列中

  3. 如果ORG1!=A和ORG3==A,将ORG3值移到ORG1列中

如果满足条件2,同时将ORG2值移动到ORG1列,也将AS20*中的列值移动到AS10*。在

类似地,如果满足条件3,并将ORG3值移动到ORG1列,也将AS30*中的列值移动到AS10*。在

我自己根据上面的规则编写了一个函数,并根据以下几点取得了有限的成功:

If ORG2 == A:
       return ORG1.map(ORG2)

当我试图根据情况依次映射AS201->;AS101、AS202->;AS102、AS203->;AS103等时,我迷路了。在

另一个问题是,生物体的名字不是单字母,漂亮的也不是。示例中的A相当于我的数据集中的re.match('aureus')。在

另外,每一个ORG列有20个AS列,超过150000个记录,所以我希望它可以推广到任何数量的抗生素敏感性结果。在

我有点挣扎,所以往正确的方向推几下真的很有帮助。在

提前谢谢。在

^{pr2}$

Tags: 数据函数gt名称框架列表规则敏感性
1条回答
网友
1楼 · 发布于 2024-09-28 21:36:00

我们可以选择ORG1 != A和{}的行

mask = (df['ORG1'] != 'A')&(df[orgi] == 'A')

mask就是一个布尔序列。要将值从ORG2复制到ORG1,我们可以使用

^{pr2}$

或者,既然我们知道右边的值是A,我们可以使用

df['ORG1'][mask] = 'A'

复制AS列的操作类似。在


我们可以找到其列值包含诸如'aureus'的字符串的行

df[orgi].str.contains('aureus') == True

str.contains可以将任何regex模式作为其参数。 请参阅文档:Vectorized String Methods。在

注意:通常使用df[orgi].str.contains('aureus')(没有== True),但是由于df[orgi]可能包含NaN值,我们还需要将NaN映射为False,因此我们使用df[orgi].str.contains('aureus') == True。在


import pandas as pd

filename = 'data.txt'
df = pd.read_table(filename, delimiter='\s+')
print(df)
#    Index ORG1 ORG2 ORG3  AB1 AS101 AS201 AS301    AB2 AS102 AS202 AS302
# 0      1    A  NaN  NaN  pen     S   NaN   NaN  dfluc     S   NaN   NaN
# 1      2    A    B    C  pen     R     S     S  dfluc     S     R     S
# 2      3    B    A    B  pen     S     S     R  dfluc     S     S     R
# 3      4    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN
# 4      5    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN
# 5      6    C    A    A  pen     S     R     R  dfluc     R     S     R
# 6      7    B  NaN    A  pen     R   NaN     S  dfluc     S   NaN     S
# 7      8    A    B    A  pen     R     R     R  dfluc     R     R     R
# 8      9    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN

for i in range(2,4):
    orgi = 'ORG{i}'.format(i=i)
    # mask = (df['ORG1'] != 'A')&(df[orgi] == 'A')
    mask = (df['ORG1'].str.contains('A') == False)&(df[orgi].str.contains('A') == True)
    # Move ORGi  > ORG1
    df['ORG1'][mask] = df[orgi][mask]
    for j in range(1,4):
        # Move ASij  > AS1j
        source_as = 'AS{i}{j:02d}'.format(i=i, j=j)
        target_as = 'AS1{j:02d}'.format(i=i, j=j)
        try:
            df[target_as][mask] = df[source_as][mask]
        except KeyError:
            pass

print(df)

收益率

   Index ORG1 ORG2 ORG3  AB1 AS101 AS201 AS301    AB2 AS102 AS202 AS302
0      1    A  NaN  NaN  pen     S   NaN   NaN  dfluc     S   NaN   NaN
1      2    A    B    C  pen     R     S     S  dfluc     S     R     S
2      3    A    A    B  pen     S     S     R  dfluc     S     S     R
3      4    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN
4      5    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN
5      6    A    A    A  pen     R     R     R  dfluc     S     S     R
6      7    A  NaN    A  pen     S   NaN     S  dfluc     S   NaN     S
7      8    A    B    A  pen     R     R     R  dfluc     R     R     R
8      9    A  NaN  NaN  pen     R   NaN   NaN  dfluc     S   NaN   NaN

请注意,如果ORG2 == AORG3 == A,则列AS20*和{}中的值都会竞争覆盖AS10*列中的值。我不知道你想赢哪个值。在上面的代码中,最后一个列获胜,这将是AS30*。在

相关问题 更多 >