2

生物名とその抗生物質感受性のリストを含むパンダデータフレームがあります。以下のルールに基づいて、以下の DataFrame ですべての生物を 1 つの列に統合したいと考えています。

  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と条件をもとに順番にマッピングしようとしたら迷いました。

私が抱えているもう 1 つの問題は、生物の名前が 1 文字ではなく、かわいい文字でもないことです。例の A は、私のデータセットと同等re.match('aureus')です。

また、ORG 列ごとに 20 の AS 列があり、150,000 を超えるレコードがあるため、任意の数の抗生物質感受性の結果に対して一般化できるようにしたいと考えています。

私はそれに少し苦労しているので、正しい方向に数回押すと本当に助けになります.

前もって感謝します。

インデックス ORG1 ORG2 ORG3 AB1 AS101 AS201 AS301 AB2 AS102 AS202 AS302
1 A NaN NaN pen S NaN NaN dfluc S NaN NaN
2 ABC ペン RSS dfluc SRS
3 BABペンSSR dfluc SSR
4 A NaN NaN pen R NaN NaN dfluc S NaN NaN
5 A NaN NaN pen R NaN NaN dfluc S NaN NaN
6 CAA ペン SRR dfluc RSR
7 B NaN A pen R NaN S dfluc S NaN S
8 ABA ペン RRR dfluc RRR
9 A NaN NaN pen R NaN NaN dfluc S NaN NaN
4

1 に答える 1

2

どこで、どの行を使用して行を選択できORG1 != AますORG2 == A

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

maskその場合、ブールシリーズです。ORG2 から ORG1 に値をコピーするには、次を使用できます。

df['ORG1'][mask] = df['ORG2'][mask]

または、右側の値が であることがわかっているので、Aそのまま使用できます

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

AS 列のコピーも同様に実行できます。


'aureus'次のような文字列を列の値に含む行を見つけることができます

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

str.contains任意の正規表現パターンを引数として取ることができます。ドキュメントを参照してください: Vectorized String Methods

注: 通常はdf[orgi].str.contains('aureus')( を使用せずに使用するだけで十分ですが、値が含まれ== Trueている可能性があるため、 を False にマップする必要があるため、 を使用します。df[orgi]NaNNaNdf[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 == Aとの場合ORG3 == A、 columnAS20*AS30*both の値が競合して column の値を上書きすることに注意してくださいAS10*。どの値を獲得したいのかわかりません。上記のコードでは、最後の列が勝ちますAS30*

于 2013-04-14T09:40:20.293 に答える