Добавить префикс к заполнению, идентифицирующий значения, которые были перенесены вперед - PullRequest
1 голос
/ 07 августа 2020

Есть ли способ добавить префикс при заполнении na с заполнением pandas? У меня есть фрейм данных, содержащий таксономию c такую ​​информацию:

| Kingdom  | Phylum        | Class       | Order           | Family           | Genus         |

| Bacteria | Firmicutes    | Bacilli     | Lactobacillales | Lactobacillaceae | Lactobacillus |

| Bacteria | Bacteroidetes | Bacteroidia | Bacteroidales   |                  |               |

| Bacteria | Bacteroidetes |             |                 |                  |               |

Поскольку не все таксоны в моем фрейме данных можно полностью классифицировать, у меня есть несколько пустых ячеек. Заменив пробелы на NA и используя ffill, я могу заполнить их последней допустимой строкой в ​​каждой строке, но я хотел бы добавить к ним строку (например, «Unknown_Bacteroidales»), чтобы я мог определить, какие из них были перенесены.

До сих пор я пробовал это taxa_formatted = "unknown_" + taxonomy.fillna(method='ffill', axis=1), но это, конечно же, добавляет префикс «unknown_» ко всему в фрейме данных.

Ответы [ 2 ]

2 голосов
/ 07 августа 2020

Вы можете использовать boolean masking с df.isna.

df = df.replace("", np.nan)  # if already NaN present skip this step
d = df.ffill()

d[df.isna()]+="(Copy)"
d
    Kingdom         Phylum              Class                Order                  Family                Genus
0  Bacteria     Firmicutes            Bacilli      Lactobacillales        Lactobacillaceae        Lactobacillus
1  Bacteria  Bacteroidetes        Bacteroidia        Bacteroidales  Lactobacillaceae(Copy)  Lactobacillus(Copy)
2  Bacteria  Bacteroidetes  Bacteroidia(Copy)  Bacteroidales(Copy)  Lactobacillaceae(Copy)  Lactobacillus(Copy)

Здесь вы можете использовать df.add.

d = df.ffill(axis=1)
df.add("unkown_" + d[df.isna()],fill_value='')

    Kingdom         Phylum                 Class                 Order                Family                 Genus
0  Bacteria     Firmicutes               Bacilli       Lactobacillales      Lactobacillaceae         Lactobacillus
1  Bacteria  Bacteroidetes           Bacteroidia         Bacteroidales  unkown_Bacteroidales  unkown_Bacteroidales
2  Bacteria  Bacteroidetes  unkown_Bacteroidetes  unkown_Bacteroidetes  unkown_Bacteroidetes  unkown_Bacteroidetes
1 голос
/ 07 августа 2020

IIU C, нужно использовать mask и update

#make true nan's first.
#df = df.replace('',np.nan)

s = df.isnull()
df = df.ffill(axis=1)

df.update('unknown_' + df.mask(~s) )

print(df)

   Bacteria     Firmicutes                Bacilli        Lactobacillales  \
0  Bacteria  Bacteroidetes            Bacteroidia          Bacteroidales   
1  Bacteria  Bacteroidetes  unknown_Bacteroidetes  unknown_Bacteroidetes   

        Lactobacillaceae          Lactobacillus  
0  unknown_Bacteroidales  unknown_Bacteroidales  
1  unknown_Bacteroidetes  unknown_Bacteroidetes  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...